指针传染媒介对对象 - 记忆泄漏

时间:2012-06-28 23:28:49

标签: c++ vector

我有一个指向类对象的指针向量。这些类对象也调用“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个源文件。

6 个答案:

答案 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)

您有几个选择:

  1. 您可以清楚地知道向量不拥有其中的对象,只有指向它们的指针。然后,它成为使用此向量分配和删除对象本身的所有代码的责任。

  2. 您可以使用提升ptr_vector。向量将拥有它包含指针的对象。您需要编写辅助函数来复制对象,以便x = y;起作用。 (由于x需要拥有y中每个对象的副本。)

  3. 您可以使用智能指针,例如boost::shared_ptr。如果执行x = y;,则两个向量将引用相同的对象,这样更改一个值将改变另一个中的值。向量将共享对象的所有权,并可以返回对其中对象的安全引用。当不再需要它们时,它们会自毁。

  4. 您可以使用boost::any个对象的向量。这表现不佳但非常灵活。

  5. 但它真正归结为经典问题:你想做什么?你是否试图管理对象的生命周期?如果你复制一个向量,会发生什么?应该复制基础对象吗?你需要多态吗?你使用指针避免切片吗?等等。解释您的用例,您将获得更好的解决方案建议。

    更新:您对指针向量的使用看似简单而安全(只要您不尝试复制构造向量,分配它或类似的东西)。你的delete循环崩溃表明你的析构函数可能存在错误。

    Update2 :是的。

    laboratory::~laboratory()
    {
        delete stationUsers;
    }
    

    这是错误的,因为stationUsers未与new分配,而是new[]

答案 3 :(得分:1)

很难知道没有更多代码,但请考虑:

delete[] Users;

答案 4 :(得分:0)

不要自己从堆中分配数组。使用std::vector<User>。此外,您永远不会自己使用deletedelete[]。始终使用基于类的解决方案(如智能指针或std::vector)来管理您的记忆。

答案 5 :(得分:0)

除了其他评论之外,您的代码还有一个Off-by-One错误。此代码引用了一个超出数组末尾的代码。

for(int i = 0; i `<` vectorSize; i++)
    delete labVector[i];