3

我在 amd64 架构上。以下代码在“if”语句中被 g++ 编译器拒绝:

void * newmem=malloc(n);
if(newmem==0xefbeaddeefbeadde){

带有错误消息:

error: ISO C++ forbids comparison between pointer and integer [-fpermissive]

我似乎找不到让它运行所需的魔法咒语(而且我不想使用 -fpermissive)。任何帮助表示赞赏。

背景:我正在寻找一个丑陋的错误,它在某些 STL 新操作中请求内存时使我的程序崩溃(至少 gdb 告诉我)。认为它可能是分配的内存块之一的一些内存溢出,不幸的是,与操作系统用来管理我的程序的内存列表的内存相邻,我迅速覆盖了 new(),new 加上它们的删除对应的例程增加了内存围栏;虽然应用程序仍然崩溃(所有围栏都完好无损(叹气)),但 gdb 现在告诉我:

Program received signal SIGSEGV, Segmentation fault.
0x0000000000604f5e in construct (__val=..., __p=0xefbeaddeefbeadde, this=<optimized out>)
at /usr/include/c++/4.6/ext/new_allocator.h:108
108           { ::new((void *)__p) _Tp(__val); }

我注意到指针__p的值是我用于我的一个内存栅栏 (0xdeadbeef) 的值的指针表示,因此我希望在我的 new() 中更早地捕捉到这一点,以尝试在我的程序。

附加说明:它崩溃的函数在崩溃之前完美地运行了几百万次(与几十个其他例程混合在一起,这些例程也都运行了几千到几百万次),使用 valgrind 似乎不是一个选项 atm,因为它需要我的程序崩溃前 6 小时和 11 Gb。

4

3 回答 3

2

其中一个是整数,另一个是指针。也许一个丑陋的演员会做

if(newmem==(void*)0xefbeaddeefbeadde){
于 2012-07-07T11:06:46.550 回答
1

对于您的问题:您有 2 个选项 - 将指针转换为 64 位数字或将数字转换为void*


对于背景:由于这花费的时间太长,可能是内存泄漏。因此,请尝试valgrind- 无需等待崩溃,只需运行您的程序valgrind并使用适当的选项即可。valgrind也可以帮助您捕捉未定义的行为。

Another thing - compile your program with -O0 optimization level and with max level of debug symbols - -ggdb3. Also, if your executable does not generate a core dump, when this error occurs, make it generate. Then leave it working, while you're trying different approaches to catch the error.

In case you don't succeed, you'll at least have a (hopefully) nice core dump, that you can examine with gdb your_exe the_core_dump. Then, watch the core frame by frame, watch the variables, etc.

If it's not a memory leak, it could be a memory corruption somewhere, undefined behavior or something like this. If a good core dump is generated, you'll probably catch the error. Or, at least, it could give you useful information about the case.

另一件事,如果您生成核心转储(无论是好还是坏),这可能很有用 - 转储的大小。如果它太大(“大”的定义取决于你的程序),那么你很可能有内存泄漏(它可能是某种交叉引用问题,如果你使用智能指针,如果是这样 -valgrind不会捕获它)

于 2012-07-07T11:16:22.580 回答
0

那样可能行不通。下次您的程序运行时,malloc可能永远不会返回该值。您必须做其他事情,而不仅仅是检查 new 的返回

于 2012-07-07T11:37:55.817 回答