2

このコードがメモリ リークを引き起こしているのは、おそらく 4 行目で削除する前に 3 行目でポインターを再割り当てしたことが原因でしょうか??

ありがとう。

1. int y = 12;
2. int *pt = new int;
3. pt = &y;
4. delete pt; 
4

6 に答える 6

4

コードのメモリ リークが不明な場合は、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 ポインタの重複。

    • メモリ リーク。

このような問題は、他の手段では見つけるのが難しく、長期間検出されないことが多く、診断が困難なクラッシュが発生することがあります。

于 2013-05-10T19:40:13.173 に答える