このコードがメモリ リークを引き起こしているのは、おそらく 4 行目で削除する前に 3 行目でポインターを再割り当てしたことが原因でしょうか??
ありがとう。
1. int y = 12;
2. int *pt = new int;
3. pt = &y;
4. delete pt;
このコードがメモリ リークを引き起こしているのは、おそらく 4 行目で削除する前に 3 行目でポインターを再割り当てしたことが原因でしょうか??
ありがとう。
1. int y = 12;
2. int *pt = new int;
3. pt = &y;
4. delete pt;
コードのメモリ リークが不明な場合は、valgrind valgrind --tool=memcheck
を使用してチェックできますが、最適化を行わずに完全なデバッグ モード ("g++ -g" など) でコードをコンパイルしてください。
プログラムの出力は次のとおりです。
=29667== Memcheck, a memory error detector
==29667== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==29667== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==29667== Command: ./main
==29667==
==29667== Invalid free() / delete / delete[]
==29667== at 0x4C26DCF: operator delete(void*) (vg_replace_malloc.c:387)
==29667== by 0x4006AB: main (main.cpp:7)
==29667== Address 0x7fefffd0c is on thread 1's stack
==29667==
==29667==
==29667== HEAP SUMMARY:
==29667== in use at exit: 4 bytes in 1 blocks
==29667== total heap usage: 1 allocs, 1 frees, 4 bytes allocated
==29667==
==29667== LEAK SUMMARY:
==29667== definitely lost: 4 bytes in 1 blocks
==29667== indirectly lost: 0 bytes in 0 blocks
==29667== possibly lost: 0 bytes in 0 blocks
==29667== still reachable: 0 bytes in 0 blocks
==29667== suppressed: 0 bytes in 0 blocks
==29667== Rerun with --leak-check=full to see details of leaked memory
==29667==
==29667== For counts of detected and suppressed errors, rerun with: -v
==29667== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 4 from 4)
コードは exit() で 4 バイトを失います。
ツールのWeb サイトから、memcheck でできることのリストを次に示します。
Memcheck は、メモリ エラー検出器です。C および C++ プログラムで一般的な次の問題を検出できます。
ヒープ ブロックのオーバーランとアンダーラン、スタックのトップのオーバーラン、解放後のメモリへのアクセスなど、すべきでないメモリへのアクセス。
未定義の値、つまり初期化されていない値、または他の未定義の値から派生した値の使用。
ヒープ ブロックの二重解放、malloc/new/new[] と free/delete/delete[] の不一致の使用など、ヒープ メモリの不適切な解放
memcpy および関連する関数での src および dst ポインタの重複。
メモリ リーク。
このような問題は、他の手段では見つけるのが難しく、長期間検出されないことが多く、診断が困難なクラッシュが発生することがあります。