Home  >  Article  >  Backend Development  >  How to debug C++ memory leaks using Valgrind?

How to debug C++ memory leaks using Valgrind?

WBOY
WBOYOriginal
2024-06-03 16:48:01907browse

How to debug C++ memory leaks using Valgrind?

How to use Valgrind to debug C++ memory leaks

Valgrind is a powerful memory debugger that can be used to detect memory leaks in C++ programs , illegal use and distribution issues. Here's how to use Valgrind to debug C++ memory leaks:

1. Install Valgrind

Use the following command to install Valgrind:

sudo apt install valgrind

2. Compiling and Debugging

When compiling the program, add the -g flag to generate debugging information:

g++ -g my_program.cpp -o my_program

Then, use Valgrind to run the program and use --leak-check=full Flag to check for memory leaks:

valgrind --leak-check=full ./my_program

3. Analyze Valgrind output

The output of Valgrind will contain information about the detected memory leaked information.

Practical case

The following is a simple C++ program that simulates a memory leak:

#include <iostream>

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

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

Compile and use Valgrind to run this program:

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

The output of Valgrind will contain the following information:

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

This output indicates that there is a 4-byte memory leak in the program, which comes from an unreleased ## in the function leak() #int Pointer.

The above is the detailed content of How to debug C++ memory leaks using Valgrind?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn