c++ - 了解 Valgrind 输出

标签 c++ valgrind

我编写了以下代码以对 Valgrind 有一个基本的了解,并且很难解释它的输出。这可能与 Valgrind 无关,但更基本的 C++。

#include <string>
#include <iostream>
using namespace std;

class Valgrind_testclass
{
std::string * stringInHeap;

public:
  Valgrind_testclass() { 
    stringInHeap = new std::string("String in heap");   
  }
  ~Valgrind_testclass() {
    //delete stringInHeap;                  
  }

  void PrintFunc(void) {
    cout << "Nothing but a printout" << endl;
  }
};

int main()
{
 Valgrind_testclass * valObjPtr = new Valgrind_testclass();  
 delete valObjPtr;               
 return 0;
}

Valgrind 输出:

==4459== HEAP SUMMARY:
==4459==     in use at exit: 31 bytes in 2 blocks
==4459==   total heap usage: 3 allocs, 1 frees, 35 bytes allocated
==4459== 
==4459== Searching for pointers to 2 not-freed blocks
==4459== Checked 102,100 bytes
==4459== 
==4459== 31 (4 direct, 27 indirect) bytes in 1 blocks are definitely lost in loss record 2 of 2
==4459==    at 0x402641D: operator new(unsigned int) (vg_replace_malloc.c:255)
==4459==    by 0x80487DB: Valgrind_testclass::Valgrind_testclass() (in /home/madu/C++/ValgrindTest)
==4459==    by 0x80486F6: main (in /home/madu/C++/ValgrindTest)
==4459== 
==4459== LEAK SUMMARY:
==4459==    definitely lost: 4 bytes in 1 blocks
==4459==    indirectly lost: 27 bytes in 1 blocks
==4459==      possibly lost: 0 bytes in 0 blocks
==4459==    still reachable: 0 bytes in 0 blocks
==4459==         suppressed: 0 bytes in 0 blocks
==4459== 
==4459== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 17 from 6)

有人可以告诉我在哪里进行 3 次分配吗?我只能看到两个分配。还有为什么它说“间接丢失”?

谢谢。

最佳答案

当您构造一个 std::string 对象时,它会分配另一个指针(对象内部)来指向字符串值。这是第三次分配的来源,也是间接泄漏的内存。

换句话说,你有这三个分配:

  1. new Valgrind_testclass()(显式)
  2. new std::string("String in heap")(显式)
  3. 字符串内部分配(隐式/间接)

由于您泄露了分配 2,因此您也间接泄露了分配 3;字符串的析构函数不会被调用,因此它没有机会释放分配 3。

关于c++ - 了解 Valgrind 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11615808/

相关文章:

c# - 触摸屏应用程序,我需要学习一门新语言吗?

c - Valgrind 使用 getline() 给出错误

c++ - 分配临时变量或计算表达式两次

c++ - 如何在不出现 C2227 错误的情况下调用此方法?

c - Valgrind 关于 asprintf : address is 0 bytes inside a block of size <size> alloc'd

无法释放内存

c - Valgrind 内存泄漏可达

c - 如何让 valgrind 显示守护进程应用程序的内存状态?

java - 网络服务器用什么编程语言

c++ - 获取对 typeid() 对象的引用?