このブラウザーはサポートされなくなりました。 Microsoft Edge にアップグレードすると、最新の機能、セキュリティ更新プログラム、およびテクニカル サポートを利用できます。
Dumping objects -> {16} normal block at 0x00780EC0, 4 bytes long. Data: < > CD CD CD CD Object dump complete. このように、メモリリークがあるとその旨を表示し、アドレスとバイト数、そしてそのデータの内容を表示してくれます。 しかし、これだけでは一体どのコードでメモリリークしたのかがさっぱりわかりません(new int; のところじゃないか、なんて無粋な突っ込みはなしね)。 そのためには operator new(size_t, const char*, int) を作って new する際にファイル名 __FILE__ と行番号 __LINE__ を記録するようにさせればいいわけですが、VC++ではデバッグビルド時に _CRTDBG_MAP_ALLOC というマクロを定義してやれば自動
MFC AppWizardなんかでアプリを作成すると、Debug動かしたときに、プログラム終了時に開放されていないメモリに対して警告を出してくれる。 Detected memory leaks! Dumping objects -> C:\work\Foo\Foo.cpp(240) : {53} normal block at 0x003F4548, 1 bytes long. Data: < > 00 Object dump complete. スレッド 0xD40 終了、終了コード 2 (0x2)。 プログラム 'C:\work\Foo\Debug\Foo.exe' はコード 2 (0x2) で終了しました。 この場合、Foo.cppの240行目に LPTSTR szBuff = (LPTSTR) new TCHAR[nLen]; てな具合にnewで確保したメモリがあるわけだ
ヘッダ等に以下の通りに書いておく。 #define _CRTDBG_MAP_ALLOC #include <stdlib.h> #include <new> #include <crtdbg.h> ... #define new ::new(_NORMAL_BLOCK, __FILE__, __LINE__) #define new は「ファイル:行番号」を正しく出させるため。 <crtdbg.h> は以下のようになっているので、いつも同じ「ファイル:行番号」になる。 inline void * __cdecl operator new(size_t s) { return ::operator new(s, _NORMAL_BLOCK, __FILE__, __LINE__); } なお、この new に置き換えると STL 系のヘッダから取り込まれる(?) <xdebug> で エラー
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く