C++ でメモリ リークを見つけるには、Valgrind と AddressSanitizer を利用できます。 Valgrind はリークを動的に検出し、アドレス、サイズ、呼び出しスタックを表示します。 AddressSanitizer は、メモリ エラーとリークを検出する Clang コンパイラ プラグインです。 ASan リーク チェックを有効にするには、コンパイル時に --leak-check=full オプションを使用します。これにより、プログラムの実行後にリークが報告されます。
Valgrind または AddressSanitizer を使用して C++ でメモリ リークを見つける方法
はじめに
メモリ リークは、C++ のような言語でよくある問題です。これらのリークを検出して解決するには、Valgrind や AddressSanitizer などのツールを使用できます。
Valgrind でメモリ リークを見つける
Valgrind は、メモリ リークを検出できる動的メモリ デバッグ ツールです。 Valgrind を使用するには:
valgrind ./my_program
Valgrind はプログラムを実行し、検出されたメモリ リークを報告します。出力には、リークしたアドレス、サイズ、呼び出しスタックが表示されます。
例
次の C++ コード例は、Valgrind がメモリ リークを検出する方法を示しています。
int* ptr = new int[10]; // ... // 忘记释放 ptr
このコードを実行し、Valgrind を使用すると、次の出力が生成されます。
==8445== LeakSanitizer: detected memory leaks ==8445== Direct leak of 40 bytes in 1 object(s) allocated from: #0 0x49f2c0 in default_new_allocator_000000157013e0000000 ::operator() () (_libunwind.dylib:0x103d8e000) #1 0x41626f in create_array () in /tmp/a.out:10 #2 0x415b2d in main () in /tmp/a.out:15 SUMMARY: ==8445== LEAK SUMMARY: ==8445== definitely lost: 40 bytes in 1 object(s)
出力は、40 バイトがリークされ、アドレス 0x49f2c0 に配置されていることを示しています。 。
AddressSanitizer でメモリ リークを見つける
AddressSanitizer (ASan) は、メモリ リークを含むメモリ エラーを検出できる Clang コンパイラ プラグインです。 ASan を使用するには:
clang++ -fsanitize=address ...
ASan はメモリ アクセス エラーを検出し、エラーが発生したときにクラッシュ レポートを生成します。メモリ リークを確認するには、プログラムを 2 回実行します:
./my_program # 第一次运行 ./my_program --leak-check=full # 第二次运行,启用泄漏检查
2 回目の実行では、検出されたメモリ リークが報告されます。
例
次の C++ コード例は、AddressSanitizer がメモリ リークを検出する方法を示しています。
int* ptr = new int[10]; // ... // 忘记释放 ptr
ASan を有効にしてこのコードをコンパイルして実行すると、次の出力が生成されます。アドレス 0x7fdd1b000010 に割り当てられます。
以上がValgrind または AddressSanitizer を使用して C++ でメモリ リークを見つけるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。