要找出 C 中的記憶體洩漏,可以利用 Valgrind 和 AddressSanitizer。 Valgrind 動態偵測洩漏,顯示位址、大小和呼叫堆疊。 AddressSanitizer 是一個 Clang 編譯器插件,可偵測記憶體錯誤和洩漏。若要啟用 ASan 洩漏檢查,請在編譯時使用 --leak-check=full 選項,該選項將在程式執行後報告洩漏。
如何使用Valgrind 或AddressSanitizer 尋找C 中的記憶體洩漏
引言##記憶體洩漏是C 等語言中常見的問題。為了檢測和解決這些洩漏,可以使用像 Valgrind 和 AddressSanitizer 這樣的工具。
使用 Valgrind 尋找記憶體洩漏Valgrind 是一個動態記憶體偵錯工具,可以偵測記憶體洩漏。要使用 Valgrind:
valgrind ./my_programValgrind 將運行程式並報告任何偵測到的記憶體洩漏。輸出將顯示洩漏的位址、大小和呼叫堆疊。
範例以下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中文網其他相關文章!