Maison  >  Article  >  développement back-end  >  Comment trouver des fuites de mémoire en C++ en utilisant Valgrind ou AddressSanitizer ?

Comment trouver des fuites de mémoire en C++ en utilisant Valgrind ou AddressSanitizer ?

WBOY
WBOYoriginal
2024-06-02 21:23:00759parcourir

Pour trouver les fuites de mémoire en C++, vous pouvez profiter de Valgrind et AddressSanitizer. Valgrind détecte dynamiquement les fuites, affichant l'adresse, la taille et la pile d'appels. AddressSanitizer est un plugin de compilateur Clang qui détecte les erreurs et les fuites de mémoire. Pour activer la vérification des fuites ASan, utilisez l'option --leak-check=full lors de la compilation, qui signalera les fuites après l'exécution du programme.

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

Comment trouver des fuites de mémoire en C++ à l'aide de Valgrind ou AddressSanitizer

Introduction
Les fuites de mémoire sont un problème courant dans des langages comme C++. Pour détecter et résoudre ces fuites, des outils comme Valgrind et AddressSanitizer peuvent être utilisés.

Trouver des fuites de mémoire avec Valgrind
Valgrind est un outil de débogage de mémoire dynamique qui peut détecter les fuites de mémoire. Pour utiliser Valgrind :

valgrind ./my_program

Valgrind exécutera le programme et signalera toute fuite de mémoire détectée. La sortie affichera l’adresse, la taille et la pile d’appels divulguées.

Exemple
L'exemple de code C++ suivant montre comment Valgrind détecte une fuite de mémoire :

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

L'exécution de ce code et l'utilisation de Valgrind produisent la sortie suivante :

==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)

La sortie montre que 40 octets ont été divulgués et se trouvent à l'adresse 0x49f2c0 distribuer.

Trouver des fuites de mémoire avec AddressSanitizer
AddressSanitizer (ASan) est un plugin de compilateur Clang qui peut détecter les erreurs de mémoire, y compris les fuites de mémoire. Pour utiliser ASan :

clang++ -fsanitize=address ...

ASan détectera les erreurs d'accès à la mémoire et générera un rapport de crash lorsqu'une erreur se produit. Pour vérifier les fuites de mémoire, exécutez le programme deux fois :

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

La deuxième exécution signalera toutes les fuites de mémoire détectées.

Exemple
L'exemple de code C++ suivant montre comment AddressSanitizer détecte les fuites de mémoire :

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

La compilation et l'exécution de ce code, avec ASan activé, produiront le résultat suivant :

==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)

La sortie montre que 40 octets ont été divulgués et à l'adresse Attribué à 0x7fdd1b000010.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn