Um Speicherlecks in C++ zu finden, können Sie Valgrind und AddressSanitizer nutzen. Valgrind erkennt Lecks dynamisch und zeigt Adresse, Größe und Aufrufstapel an. AddressSanitizer ist ein Clang-Compiler-Plugin, das Speicherfehler und -lecks erkennt. Um die ASan-Leckprüfung zu aktivieren, verwenden Sie beim Kompilieren die Option --leak-check=full, die Lecks meldet, nachdem das Programm ausgeführt wurde.
So finden Sie Speicherlecks in C++ mit Valgrind oder AddressSanitizer
Einführung
Speicherlecks sind ein häufiges Problem in Sprachen wie C++. Um diese Lecks zu erkennen und zu beheben, können Tools wie Valgrind und AddressSanitizer verwendet werden.
Speicherlecks finden mit Valgrind
Valgrind ist ein dynamisches Speicher-Debugging-Tool, das Speicherlecks erkennen kann. So verwenden Sie Valgrind:
valgrind ./my_program
Valgrind führt das Programm aus und meldet alle erkannten Speicherlecks. Die Ausgabe zeigt die durchgesickerte Adresse, Größe und Aufrufliste.
Beispiel
Das folgende C++-Codebeispiel zeigt, wie Valgrind einen Speicherverlust erkennt:
int* ptr = new int[10]; // ... // 忘记释放 ptr
Das Ausführen dieses Codes und die Verwendung von Valgrind erzeugt die folgende Ausgabe:
==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)
Die Ausgabe zeigt, dass 40 Bytes verloren gegangen sind und sich an der Adresse 0x49f2c0 verteilen .
Speicherlecks finden mit AddressSanitizer
AddressSanitizer (ASan) ist ein Clang-Compiler-Plugin, das Speicherfehler, einschließlich Speicherlecks, erkennen kann. So verwenden Sie ASan:
clang++ -fsanitize=address ...
ASan erkennt Speicherzugriffsfehler und generiert einen Absturzbericht, wenn ein Fehler auftritt. Um nach Speicherlecks zu suchen, führen Sie das Programm zweimal aus:
./my_program # 第一次运行 ./my_program --leak-check=full # 第二次运行,启用泄漏检查
Beim zweiten Lauf werden alle erkannten Speicherlecks gemeldet.
Beispiel
Das folgende C++-Codebeispiel zeigt, wie AddressSanitizer Speicherlecks erkennt:
int* ptr = new int[10]; // ... // 忘记释放 ptr
Das Kompilieren und Ausführen dieses Codes mit aktiviertem ASan erzeugt die folgende Ausgabe:
==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)
Die Ausgabe zeigt, dass 40 Bytes verloren gegangen sind, und an der Adresse Zugewiesen bei 0x7fdd1b000010.
Das obige ist der detaillierte Inhalt vonWie finde ich Speicherlecks in C++ mit Valgrind oder AddressSanitizer?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!