为什么valgrind显示泄漏,即使包含动态分配对象的向量被释放
Why valgrind shows leaks, even when the vector containing dynamically allocated objects is freed?
我使用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释放。
你是负责删除这些记忆的人。
相关文章:
- 对具有动态分配的内存和析构函数的类对象的引用
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 销毁C++中动态分配的内存(数组对象)
- C++ 将抽象类型的动态分配对象传递给函数并存储在向量中
- 动态分配的对象未初始化
- std::p air 会破坏其动态分配的对象吗?
- 动态分配对象中的字段-动态分配更好还是静态分配更好?C++
- 如果您为类的一个对象动态分配内存作为参数,会发生什么
- 使用私有析构函数删除动态分配的对象
- 动态分配许多 Boost::直方图对象
- 如何使用每个对象的单个构造函数参数动态分配C++对象数组?
- 将动态分配对象传递到 boost::any 构造函数中
- 将动态分配的对象添加到对象指针数组中
- 如何删除列表中的动态分配类对象<T>?
- 处理另一个类中类动态分配的对象数组
- 如何使用一些参数初始化动态分配的数组中的对象
- 使用 new: "potentially uninitialized pointer"将对象数组动态分配给指针
- 如何复制或返回包含动态分配的内存的对象
- C 删除指向动态分配对象的指针