Valgrind または AddressSanitizer を使用して C++ でメモリ リークを見つけるにはどうすればよいですか?

WBOY
リリース: 2024-06-02 21:23:00
オリジナル
753 人が閲覧しました

C++ でメモリ リークを見つけるには、Valgrind と AddressSanitizer を利用できます。 Valgrind はリークを動的に検出し、アドレス、サイズ、呼び出しスタックを表示します。 AddressSanitizer は、メモリ エラーとリークを検出する Clang コンパイラ プラグインです。 ASan リーク チェックを有効にするには、コンパイル時に --leak-check=full オプションを使用します。これにより、プログラムの実行後にリークが報告されます。

如何使用 Valgrind 或 AddressSanitizer 查找 C++ 中的内存泄漏?

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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート