Untuk mencari kebocoran memori dalam C++, anda boleh memanfaatkan Valgrind dan AddressSanitizer. Valgrind mengesan kebocoran secara dinamik, menunjukkan alamat, saiz dan timbunan panggilan. AddressSanitizer ialah pemalam pengkompil Clang yang mengesan ralat dan kebocoran memori. Untuk mendayakan semakan kebocoran ASan, gunakan pilihan --leak-check=full semasa menyusun, yang akan melaporkan kebocoran selepas program dijalankan.
Cara mencari kebocoran memori dalam C++ menggunakan Valgrind atau AddressSanitizer
Pengenalan
Kebocoran memori adalah masalah biasa dalam bahasa seperti C++. Untuk mengesan dan menyelesaikan kebocoran ini, alatan seperti Valgrind dan AddressSanitizer boleh digunakan.
Cari kebocoran memori dengan Valgrind
Valgrind ialah alat penyahpepijat memori dinamik yang boleh mengesan kebocoran memori. Untuk menggunakan Valgrind:
valgrind ./my_program
Valgrind akan menjalankan program dan melaporkan sebarang kebocoran memori yang dikesan. Output akan menunjukkan alamat, saiz dan timbunan panggilan yang bocor.
Contoh
Contoh kod C++ berikut menunjukkan cara Valgrind mengesan kebocoran ingatan:
int* ptr = new int[10]; // ... // 忘记释放 ptr
Menjalankan kod ini dan menggunakan Valgrind menghasilkan output berikut:
==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)
Output menunjukkan bahawa 40 bait diedarkan 0x49 terletak pada alamat 2 cf2 cf49 .
Cari kebocoran memori dengan AddressSanitizer
AddressSanitizer (ASan) ialah pemalam pengkompil Clang yang boleh mengesan ralat memori, termasuk kebocoran memori. Untuk menggunakan ASan:
clang++ -fsanitize=address ...
ASan akan mengesan ralat akses memori dan menjana laporan ranap apabila ralat berlaku. Untuk menyemak kebocoran memori, jalankan program dua kali:
./my_program # 第一次运行 ./my_program --leak-check=full # 第二次运行,启用泄漏检查
Larian kedua akan melaporkan sebarang kebocoran memori yang dikesan.
Contoh
Contoh kod C++ berikut menunjukkan cara AddressSanitizer mengesan kebocoran memori:
int* ptr = new int[10]; // ... // 忘记释放 ptr
Menyusun dan menjalankan kod ini, dengan ASan didayakan, akan menghasilkan output berikut:
==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)
Keluaran menunjukkan bahawa 40 dan bait adalah bocor di alamat Ditugaskan di 0x7fdd1b000010.
Atas ialah kandungan terperinci Bagaimana untuk mencari kebocoran memori dalam C++ menggunakan Valgrind atau AddressSanitizer?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!