首頁  >  文章  >  後端開發  >  如何使用 Valgrind 或 AddressSanitizer 來尋找 C++ 中的記憶體洩漏?

如何使用 Valgrind 或 AddressSanitizer 來尋找 C++ 中的記憶體洩漏?

WBOY
WBOY原創
2024-06-02 21:23:00704瀏覽

要找出 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 將偵測記憶體存取錯誤,並在發生錯誤時產生崩潰報告。若要檢查記憶體洩漏,請執行程式兩次:

./my_program # 第一次运行
./my_program --leak-check=full # 第二次运行,启用泄漏检查

第二次執行將報告任何偵測到的記憶體洩漏。

範例以下C 程式碼範例示範了AddressSanitizer 如何偵測記憶體洩漏:

int* ptr = new int[10];
// ...
// 忘记释放 ptr

編譯並執行此程式碼,啟用ASan,將輸出下列結果:

==28847== ERROR: AddressSanitizer: detected memory leaks
    SUMMARY:
    ==28847== LeakSanitizer: 40 byte(s) leaked in 1 allocation(s).
    ==28847==
    0x7fdd1b000010  40 bytes in 1 block
      ==28847== LeakSanitizer:
      ==28847==  Direct leak of 40 bytes in 1 object(s) allocated from:
      ==28847==    #0 0x7fdd17a346c0 in __sanitizer::Allocator<std::__detail::__shared_count>::allocate(unsigned long) (_sanitizer.h:1195)
      ==28847==    #1 0x7fdd184d0f90 in void* std::__detail::__shared_count<unsigned int>::allocate() (_shared_count.h:128)
      ==28847==    #2 0x7fdd182de485 in void* std::__shared_ptr<int>::__clone() (_shared_ptr.h:256)
      ==28847==    #3 0x48b935 in create_array() (/tmp/a.out:10)
      ==28847==    #4 0x48b884 in main (/tmp/a.out:15)

輸出顯示了洩漏了40 字節,並在位址0x7fdd1b000010 處分配。

以上是如何使用 Valgrind 或 AddressSanitizer 來尋找 C++ 中的記憶體洩漏?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn