为什么valgrind显示泄漏,即使包含动态分配对象的向量被释放

Why valgrind shows leaks, even when the vector containing dynamically allocated objects is freed?

本文关键字:对象 动态分配 向量 释放 包含 显示 valgrind 泄漏 为什么      更新时间:2023-10-16

我使用new:

在堆上分配了一个向量
std::vector<t*> *vec = new std::vector<t*>;

这个向量包含类"t"的类对象,这些类对象是用new

创建的
t *ptr1 = new t();
t *ptr2 = new t();
t *ptr3 = new t();
t *ptr4 = new t();

现在当我删除这个向量的时候,所有添加到它的对象都应该被销毁,我的意思是:

std::vector<t*> *vec = new std::vector<t*>;
 vec->push_back(ptr1);
 vec->push_back(ptr2);
 vec->push_back(ptr3);
 vec->push_back(ptr4);
ptr1、ptr2、ptr3、ptr4所指向的

内存也应该被释放。

但是Valgrind显示这是一个泄漏!!Valgrind故障了吗?

==15634==
==15634== HEAP SUMMARY:
==15634==     in use at exit: 48 bytes in 8 blocks
==15634==   total heap usage: 12 allocs, 4 frees, 128 bytes allocated
==15634==
==15634== LEAK SUMMARY:
==15634==    definitely lost: 32 bytes in 4 blocks
==15634==    indirectly lost: 16 bytes in 4 blocks
==15634==      possibly lost: 0 bytes in 0 blocks
==15634==    still reachable: 0 bytes in 0 blocks
==15634==         suppressed: 0 bytes in 0 blocks
==15634== Rerun with --leak-check=full to see details of leaked memory
==15634==
==15634== For counts of detected and suppressed errors, rerun with: -v
==15634== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)

下面是完整的程序供大家参考:

#include <iostream>
#include <vector>
using namespace std;
class t
{
int *ptr;
public:
  t()
  {
    cout << "t's constructor" << endl;
    ptr = new int(50);
  }
 ~t()
  {
    cout << "t's destructor called" << endl;
    delete ptr;
  }
  void func()
  {
     cout << "This is class t's function" << endl;
  }
};
//void func(int *ptr, t* ptr1)
void func(t* ptr1)
{
 //delete ptr;
 delete ptr1;
}
int main( )
{
 //int *ptr;
 t *ptr1 = new t();
 t *ptr2 = new t();
 t *ptr3 = new t();
 t *ptr4 = new t();
 //ptr =new int(20);
 //func(ptr, ptr1);
 //func(ptr1);
 std::vector<t*> *vec = new std::vector<t*>;
 vec->push_back(ptr1);
 vec->push_back(ptr2);
 vec->push_back(ptr3);
 vec->push_back(ptr4);
 delete vec;
 //delete ptr1; ===============> Are these required? Shouldn't delete vec take care?
// delete ptr2;
 //delete ptr3;
 //delete ptr4;
}

现在当我删除这个向量的时候,所有添加到其中的对象都应该被销毁

您添加了指针,指针将被销毁。

但是

并没有说明指针指向的对象。总之,你的假设是错误的。

你的选择:

  • delete在破坏矢量
  • 之前的每个点
  • 使用智能指针
  • 停止使用指针!停止使用动态分配!
    在大多数情况下,std::vector<t>应该是好的。

销毁vector对象时,只销毁该vector对象分配的内存。这意味着,向量需要内部结构来保存插入的t*。该内存肯定会被析构函数删除。但是你"更新"的值不会被vector释放。

你是负责删除这些记忆的人。