指针向量内存泄漏,如何预防?

时间:2012-09-21 08:08:38

标签: c++ memory pointers vector memory-leaks

我的程序中出现了一些内存泄漏问题,这是我认为唯一的问题。

if (inputType == 'S')
{
    SavingAccount* savingAccount = new SavingAccount();
    inFile >> *savingAccount;

    accounts.push_back(savingAccount);
}

虽然在程序结束时删除了指针向量,但我有3个错误泄漏,这似乎与我拥有的3种类型的帐户相对应。话虽如此,如果我将指针放入向量后删除它,它也会删除向量中的条目(我预期)

有谁知道如何解决这个问题?

编辑:

void Transaction::cleanUp()
{
    for (int i = 0; i < accounts.size(); i++)
    {
        delete accounts[i];
    }

    accounts.clear();
}

清理添加的代码。

编辑:已解决

我的问题与向量没有那么多,因为它做了类的析构函数。因为我没有定义虚拟析构函数,所以只删除了基类,留下派生类的片段。添加此内容后没有内存泄漏。

4 个答案:

答案 0 :(得分:7)

为什么你的向量中需要指针?我没有看到你的很多代码,但如果你的SavingAccount类是可复制的,那么下面的AFAIK也可以正常工作:

if (inputType == 'S')
    {
        SavingAccount savingAccount;
        inFile >> savingAccount;

        accounts.push_back(savingAccount); //puts a copy in the vector, so your class needs a copy ctor + Rule of Three applied.
    }

修改

看到OP说他有多态的类结构,那么OP应该使用std::unique_ptr并将其存储在std::vector中,或者考虑使用专为存储指针而设计的boost::ptr_vector

答案 1 :(得分:3)

使用std::vector std::unique_ptr<SavingAccount>或循环遍历向量,在向量超出范围或删除之前删除所有元素。

答案 2 :(得分:2)

您可以在销毁向量之前删除,也可以在向量中存储智能指针。

答案 3 :(得分:2)

在摧毁矢量之前,删除存储在矢量中的SavingAccount*

或者使用智能指针,如果可以的话。