私は amd64 アーキテクチャを使用しています。次のコードは、「if」ステートメントで g++ コンパイラによって拒否されます。
void * newmem=malloc(n);
if(newmem==0xefbeaddeefbeadde){
エラーメッセージとともに:
error: ISO C++ forbids comparison between pointer and integer [-fpermissive]
それを実行するために必要な魔法の呪文が見つからないようです (そして -fpermissive を使いたくありません)。どんな助けでも感謝します。
背景: STL の新しい操作でメモリを要求しているときにプログラムがクラッシュする醜いバグを探しています (少なくとも gdb はそう言ってくれました)。OS がプログラムのメモリ リストを管理するために使用するメモリに隣接している、割り当てられたメモリ チャンクの 1 つのメモリ オーバーランである可能性があると考えて、私はすぐに 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) の 1 つに使用した値のポインター表現であることに注意してください。プログラム。
追加の注意: クラッシュする関数は、クラッシュする前に数百万回問題なく実行されます (すべて数千回から数百万回実行される数十の他のルーチンと混在しています)。プログラムがクラッシュするまでに 6 時間と 11 Gb かかります。