質問
みなさんご存知の通り、 Visual C++ 実行時のマーク初期化されていないも解放されたメモリブロックの特別な非ゼロマーカー必要があります。を無効にするこの動作には全く手動で設定すべて初期化されていないメモリをゼロ?このゲ私有効なnullチェック、 0xFEEEFEEE != 0
.
人材管理、おそらく私に説明していく必要があるでしょう。私の作成および変数の初期化(新規)ことになるすべてのものだ。私は無料です(削除)でのポインタ 0xFEEEFEEE
の代わりに NULL
.時を挿入し、適切なチェック NULL
, は、すべての良いプログラムを管理する独自のメモリは、私たちの問題として 0xFEEEFEEE
a NULL
チェック問題なく行えます。ですが、以外に手動で設定すべてのポインタ NULL
を削除する場合は、を検出するためのメモリは解放された?私は望んで使用しないで Boost 単に壊してしまうことを意味しているオーバーヘッドを小さくなっているのが分かれてることになりそうもんさげます。
解決
ではありませんの責任 delete
リセットすべてにポインタをオブジェクト NULL
.まただし、デフォルトのメモリに記入し、windowsのデバッグ実行時は、ものを使用できるかのようなもの boost::shared_ptr<>
のためのポインタの動します。
とん 撮影は自己の足 できます。
ができ 変化 の デフォルトの記入 の窓 デバッグ実行時の を用いたアロケータフックのようです。これだけに作用のヒープ割り当てオブジェクト!
int main(int argc,char** arv)
{
// Call first to register hook
_CrtSetAllocHook(&zero_fill);
// Do other stuff
malloc(100);
}
int zero_fill(int nAllocType,
void* pvData,
size_t nSize,
int nBlockUse,
long lRequest,
const unsigned char *szFileName,
int nLine )
{
/// Very Importaint !!
/// infinite recursion if this is removed !!
/// _CRT_BLOCK must not do any thing but return TRUE
/// even calling printf in the _CRT_BLOCK will cause
/// infinite recursion
if ( nBlockUse == _CRT_BLOCK )
return( TRUE );
switch(nAllocType)
{
case _HOOK_ALLOC:
case _HOOK_REALLOC:
// zero initialize the allocated space.
memset(pvData,0,nSize);
break;
case _HOOK_FREE:
break;
}
return TRUE;
}
他のヒント
を作成したときにポインター explicityを初期化する NULL
.同様にした後、 delete
.の値によって初期化されていないデータを除く少数の特定の場合)がいます。
保存できる自分の頭痛によるスマートポインタークラスなど boost::shared_ptr
それから、自動的に扱うか否かのポインタが初期化されます。
VC++'sの行動な原因は爆の他 有効な チェックインできます。の場合には0xfeeefeeeしていなかったとしたら、メモリに書き込むまたは解放されたので、なんかからの読み取りメモリ。
だ読み初期化されていないメモリ、チェックもしない"有効".メモリは解放されます。であることのできる利用もかかりました。できませんの前提約の内容に初期化されていないメモリのC/C++.
Java(およびクライアントまで、フルのC#と思います)を保証する割り当てられたメモリがゼロにご使用の前に、もちろんのガベージコレクションを防ぐ見解放されたメモリです。がん性のヒープは、公開の記憶。
を構築する場合にはリリースモードの代わりにデバッグモードでは、ランタイム満たない初期化されていないメモリがまだできないゼロのままにしておしかしながら ない 今の行動すべきかを明示的に初期化のメモリでmemset(),ZeroMemory()、またはSecureZeroMemory()、または設定フラグのどこかにすることを示すメモリは未初期化されます。読み初期化されていないメモリ未。
言います:
私の作成および変数の初期化(新規)ことになるすべてのものだ。私は無料です(削除)でのポインタ0xFEEEFEEEの代わりにNULLになります。時を挿入し、適切なチェックのためのNULLの場合、すべての良いプログラムを管理する独自のメモリは、私たちの問題として0xFEEEFEEEパスにNULLチェック問題なく行えます。
でもデバッグヒープルーチンのMSVCなの値を変更する ポインタ い削除するものに価値を見出しのポインターだけ削除する変わらないものにはNULL。そのようなアクセスポインタに所属するオブジェクトだって削除されるバグます。
きだと思うのだが何をしようとしているこだけのバ内で無効なメモリアクセス。なるべく、スニペットのコードなどは本当に起きています。
@ジェフ-ハバード(コメント):
この実際に意味を解決したい:まで設定する事が可能でpvData NULLに_HOOK_FREEないと問題0xFEEEFEEE私のポインタ。
このために働き、そのことにいただいた皆さまには、解放されたメモリが試験用の場合は、NULLポインタ(ie., のポインタを自在にメモリ解放されま).
このバグ。
のソリューションによりご利用は単に隠れていない、固定バグを修正.が解放されたメモリか割り当てるように突き用の違いとしての価値ポインタの間違ったものです。
そも特徴VC++(いかと考えるその他のコンパイラでコンパイルできますので確認することができます。平和のメモリを指すポインタをアンインストールします。まい無効化が可能です。削除したい場合はオブジェクトのC++設定してくださいポインタ NULL
場合も後を削除するオブジェクトです。この機能を可能にするスポットをお忘れの設定のポインタ NULL
.
ればよいのにリリースモードでのせん断ができます。
マイク-Bですることができるものとし、デバッグの修正が隠されている。リモードでは、ポインタが使用されて解放されたものに設定されない NULL
, のメモリーでポイントが"有効".ある時点で、将来のメモリ割り当てを変更、またはメモリに画像を変更、または何かの原因になりまを"有効"メモリブロックとなる"無効".そこで、リリースの構築を開始失敗.切り替えるデバッグモードに問題が無駄なので、デバッグモード"決定".
と思いま話すべてに同意することになり次のコードだけます。
char * p = new char[16]; // 16 bytes of random trash
strcpy(p, "StackOverflow"); // 13 characters, a '\0' terminator, and two bytes of trash
delete [] p; // return 16 bytes to the heap, but nothing else changes;
if (p != NULL) // Why would p be NULL? It was never set to NULL
ASSERT(p[0] == 'S'); // In debug, this will crash, because p = 0xfeeefeee and
// dereferencing it will cause an error.
// Release mode may or may or may not work, depending on
// other memory operations
としてすべてのその他のポスターは、ポインタ設定する必要があ NULL
を呼び出した後 delete
.を行うかどうか自分では利用力その他のラッパーでのマクロ-このスレッドが返却費用はかかりません。
というのが私のコードクラッシュ 下のデバッグ作成、 成功の下にリリース作成する。
リビルドがクラッシュするのをお客様の機です。みなさま!
って下、デバッガや 私のポインタが設定さ 0xFEEEFEEE後の呼んで削除 します。
ポインタ が変更されていない呼び出した後に削除します。このメモリのそれとを取得する設定0xfeeefeee,0xfeeefeee,...,0xfeeefeee.
場合はスポットとプログラムを読み込みデータから解放されたメモリが便利に示される0xfeeefeeeパターンのデバッグを構築する。
@[ジェフ-ハバード]:
というのが私のコードクラッシュの下に、デバッグ作成も承下のリリース作成する。って下デバッガやポインタが設定さ
0xFEEEFEEE
後に呼びかけを削除します。再び同じコードをリリースなューとして振る舞うと考えられています。
これは非常に不思議な動作ったものであり、そのう潜在的にバグが隠されているの _CrtSetAllocHook()
回避策.
の 0xFEEEFEEE
署名を使用するOSヒープマネージャーを示す解放されたメモリを参照 http://www.nobugs.org/developer/win32/debug_crt_heap.html).何かの間違いのですが後部リプロコードと正確にコンパイラのバージョンだ。
またまたできない無効化は、visual studioのデフォルトがここに、いただかなくても、価値というもったメモリの前にメモリ割り当てられます。
最良のオフを取得しているだけで癖に設定して0に、この2charecters.
int *ptr=0;
にお使いいただけますNULLでは、マクロとして定義される0でないこと、デフォルトでcarful複数の定義がincludeingもののようです。hを定義しました!
ご利用の場合はmallocなintializeの記憶する活動も実施しています。きである。したい場合に割り当てをブロックおよび初期化で0、calloc'によってmallocのみで初期化(要素サイズパラメータで設定を1にしたい場合はつねにmalloc).読んでおくべきアップcalloc前として使用での一部若干の違いがある。
http://wiki.answers.com/Q/What_is_the_difference_between_malloc_and_calloc_functions
ませんの作成をとることを習慣を用いのですか?
I.。
#define SafeDelete(mem) { delete mem; mem = NULL; }
#define SafeDeleteArray(mem) { delete [] mem; mem = NULL; }
明らかにできる名前で合わせてご利用いただけます。deleteZ,deletesafeいんですね。
このメモリマネージャーもございますそのオーバーライド新および削除を引かけ前に割り当てチャックのメモリを消費します。