我有一个指向类对象的指针向量。这些类对象也调用“new”来创建数组。
我正在努力避免内存泄漏,所以我创建了一个析构函数,它将对象的数组返回给freestore。
laboratory::~laboratory()
{
delete Users; // Users is an array from the heap
}
但是,当我尝试删除指针向量的每个元素时,程序崩溃:
for(int i = 0; i < vectorSize; i++)
delete labVector[i];
非常感谢任何帮助。
编辑:此处粘贴代码:http://pastie.org/4168453
类和函数定义在main()下面。很抱歉以这种方式粘贴它,我使用的是头文件和2个源文件。
答案 0 :(得分:4)
delete Users; // Users is an array from the heap
那么那就错了。应该是
delete [] Users;
new
[]
delete
与[]
获得vector<vector<T>>
的任何内容。
旁注;你真的需要一个指针向量吗?实际上需要它很少见(尽管你经常看到它)并且它完全否定了容器为你管理内存的能力,要求你循环并释放每个元素。
向量在每个元素的幕后使用动态内存。你可以给我们一个智能指针甚至是{{1}}的矢量(但是,如果性能是最重要的,那么锯齿状数组可能是更好的选择。不要假设它。)
答案 1 :(得分:3)
除非您完全需要自行完成此操作,否则请考虑使用Boost ptr_vector
。
答案 2 :(得分:3)
您有几个选择:
您可以清楚地知道向量不拥有其中的对象,只有指向它们的指针。然后,它成为使用此向量分配和删除对象本身的所有代码的责任。
您可以使用提升ptr_vector
。向量将拥有它包含指针的对象。您需要编写辅助函数来复制对象,以便x = y;
起作用。 (由于x
需要拥有y
中每个对象的副本。)
您可以使用智能指针,例如boost::shared_ptr
。如果执行x = y;
,则两个向量将引用相同的对象,这样更改一个值将改变另一个中的值。向量将共享对象的所有权,并可以返回对其中对象的安全引用。当不再需要它们时,它们会自毁。
您可以使用boost::any
个对象的向量。这表现不佳但非常灵活。
但它真正归结为经典问题:你想做什么?你是否试图管理对象的生命周期?如果你复制一个向量,会发生什么?应该复制基础对象吗?你需要多态吗?你使用指针避免切片吗?等等。解释您的用例,您将获得更好的解决方案建议。
更新:您对指针向量的使用看似简单而安全(只要您不尝试复制构造向量,分配它或类似的东西)。你的delete
循环崩溃表明你的析构函数可能存在错误。
Update2 :是的。
laboratory::~laboratory()
{
delete stationUsers;
}
这是错误的,因为stationUsers
未与new
分配,而是new[]
。
答案 3 :(得分:1)
很难知道没有更多代码,但请考虑:
delete[] Users;
答案 4 :(得分:0)
不要自己从堆中分配数组。使用std::vector<User>
。此外,您永远不会自己使用delete
或delete[]
。始终使用基于类的解决方案(如智能指针或std::vector
)来管理您的记忆。
答案 5 :(得分:0)
除了其他评论之外,您的代码还有一个Off-by-One错误。此代码引用了一个超出数组末尾的代码。
for(int i = 0; i `<` vectorSize; i++)
delete labVector[i];