Maison  >  Article  >  développement back-end  >  Comment déboguer les fuites de mémoire C++ à l’aide de Valgrind ?

Comment déboguer les fuites de mémoire C++ à l’aide de Valgrind ?

WBOY
WBOYoriginal
2024-06-03 16:48:01908parcourir

Comment déboguer les fuites de mémoire C++ à l’aide de Valgrind ?

Comment utiliser Valgrind pour déboguer les fuites de mémoire C++

Valgrind est un puissant débogueur de mémoire qui peut être utilisé pour détecter les fuites de mémoire, les utilisations illégales et les problèmes d'allocation dans les programmes C++. Voici comment utiliser Valgrind pour déboguer les fuites de mémoire C++ :

1. Installez Valgrind

Utilisez la commande suivante pour installer Valgrind :

sudo apt install valgrind

2. Compilez et déboguez

Lors de la compilation du programme, ajoutez . -g indicateur pour générer des informations de débogage : <code>-g 标记以生成调试信息:

g++ -g my_program.cpp -o my_program

然后,使用 Valgrind 运行程序,并使用 --leak-check=full 标记来检查内存泄漏:

valgrind --leak-check=full ./my_program

3. 分析 Valgrind 输出

Valgrind 的输出将包含有关检测到的内存泄漏的信息。

实战案例

以下是一个模拟内存泄漏的简单 C++ 程序:

#include <iostream>

int* leak() {
  int* ptr = new int;
  return ptr;
}

int main() {
  int* ptr = leak();
  return 0;
}

编译并使用 Valgrind 运行此程序:

g++ -g leak.cpp -o leak
valgrind --leak-check=full ./leak

Valgrind 的输出将包含以下信息:

==27244== Memcheck, a memory error detector
==27244== Copyright (C) 2002-2017, and GNU GPL'd by, Julian Seward et al.
==27244== Using Valgrind-3.15.0.
==27244== Command: ./leak
==27244==
==27244== HEAP SUMMARY:
==27244==     in use at exit: 4 bytes in 1 blocks
==27244==   total heap usage: 1 allocs, 0 frees, 4 bytes allocated
==27244==
==27244== LEAK SUMMARY:
==27244==    definitely lost: 4 bytes in 1 blocks
==27244==    indirectly lost: 0 bytes in 0 blocks
==27244==      possibly lost: 0 bytes in 0 blocks
==27244==    still reachable: 0 bytes in 0 blocks
==27244==         suppressed: 0 bytes in 0 blocks
==27244== Rerun with --leak-check=full to see what's still reachable
==27244==
==27244== For counts of detected and suppressed errors, rerun with: -v
==27244== Use --track-origins=yes to see where unfreed memory was allocated
==27244== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
==27244==
==27244== 1 errors in context 0 of 1:
==27244== Invalid read of size 8
==27244==    at 0x4842E10: leak (leak.cpp:5)
==27244==    by 0x483D8E7: main (leak.cpp:12)
==27244==  Address 0x555555555600 is not stack'd, malloc'd or (recently) free'd
==27244==
==27244== LEAK SUMMARY:
==27244==    definitely lost: 0 bytes in 0 blocks
==27244==    indirectly lost: 0 bytes in 0 blocks
==27244==      possibly lost: 4 bytes in 1 blocks
==27244==    still reachable: 0 bytes in 0 blocks
==27244==         suppressed: 0 bytes in 0 blocks
==27244== Rerun with --leak-check=full to see what's still reachable
==27244==
==27244== For counts of detected and suppressed errors, rerun with: -v
==27244== Use --track-origins=yes to see where unfreed memory was allocated

此输出表明程序中存在 4 字节的内存泄漏,该泄漏来自函数 leak() 中未释放的 intrrreee

Ensuite, utilisez Valgrind pour exécuter le programme et utilisez l'indicateur --leak-check=full pour vérifier les fuites de mémoire : 🎜rrreee🎜 🎜3. Analyser la sortie de Valgrind 🎜🎜🎜La sortie de Valgrind contiendra des informations sur la fuite de mémoire détectée. 🎜🎜🎜Cas pratique🎜🎜🎜Ce qui suit est un programme C++ simple qui simule une fuite de mémoire : 🎜rrreee🎜Compilez et exécutez ce programme en utilisant Valgrind : 🎜rrreee🎜La sortie de Valgrind contiendra les informations suivantes : 🎜rrreee🎜Cette sortie indique qu'il y a une fuite de mémoire dans le programme. Fuite de mémoire de 4 octets à partir d'un pointeur int non publié dans la fonction leak(). 🎜

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