首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >了解Valgrind输出

了解Valgrind输出
EN

Stack Overflow用户
提问于 2012-07-23 23:39:11
回答 2查看 185关注 0票数 1

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

代码语言:javascript
复制
#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输出:

代码语言:javascript
复制
==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次分配吗?我只能看到两个分配。还有为什么它说“间接丢失”?

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2012-07-23 23:42:15

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

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

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

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

票数 9
EN

Stack Overflow用户

发布于 2012-07-23 23:42:42

您有3个分配空间,因为std::string也会分配内存。

间接丢失,意味着您丢失了指向某个具有指向其他内存的指针的对象的指针。在本例中,您没有删除stringInHeap,并且丢失了它的指针。通过这种方式,分配了内存的实际std::string无法删除它,因此该内存也会丢失。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11615808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档