我在使用amd64架构。 g ++编译器在“if”语句中拒绝以下代码:
void * newmem=malloc(n);
if(newmem==0xefbeaddeefbeadde){
错误消息:
error: ISO C++ forbids comparison between pointer and integer [-fpermissive]
我似乎无法找到实现它所需的神奇咒语(我不想使用-fpermissive)。任何帮助表示赞赏。
背景: 我正在寻找一个丑陋的bug,它在我的程序崩溃的同时在一些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。
答案 0 :(得分:2)
其中一个是整数,另一个是指针。也许一个丑陋的演员会做
if(newmem==(void*)0xefbeaddeefbeadde){
答案 1 :(得分:1)
对于您的问题:您有2个选项 - 将指针转换为64位数字或将数字转换为void*
对于后台:因为这需要太长时间,可能是内存泄漏。所以,试试valgrind
- 无需等待崩溃,只需通过valgrind
运行您的程序并使用相应的选项。 valgrind
也可以帮助您捕捉未定义的行为。
另一件事 - 使用-O0
优化级别和最高级别的调试符号 - -ggdb3
编译您的程序。此外,如果您的可执行文件未生成核心转储,则在发生此错误时,请将其生成。然后让它工作,而你正在尝试不同的方法来捕获错误。
如果你没有成功,你至少会有一个(希望)好的核心转储,你可以用gdb your_exe the_core_dump
来检查。然后,逐帧观察核心,观察变量等。
如果它不是内存泄漏,它可能是某处的内存损坏,未定义的行为或类似的东西。如果生成了良好的核心转储,您可能会发现错误。或者,至少,它可以为您提供有关案例的有用信息。
另一件事,如果您生成核心转储(无论是好的还是坏的),那么这可能很有用 - 转储的大小。如果它太大(“大”的定义取决于你的程序),那么你很可能有内存泄漏(它可能是某种交叉引用问题,如果你使用智能指针,如果是这样的话 - {{1不会抓住它)
答案 2 :(得分:0)
这可能不会那样。下次程序运行时,malloc
可能永远不会返回该值。还有其他一些必须做的事情,而不仅仅是检查新的返回值!