【问题标题】:Memory leak in vector of pointers, how to prevent?指针向量中的内存泄漏,如何防止?
【发布时间】:2012-09-13 15:27:33
【问题描述】:

我的程序中出现了一点内存泄漏,这是我认为唯一可能发生的事情。

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();
}

已添加清理代码。

编辑:已解决

我的问题与向量的关系不如类的析构函数。由于我没有定义虚拟析构函数,因此只删除了基类,留下了派生类的片段。添加这个后没有内存泄漏。

【问题讨论】:

  • 你能发布你的清理代码吗?
  • 您写了this is about the only thing I think it could be - 为什么您认为这可能是唯一的原因?在更仔细地查看您的向量之前,请考虑使用 newmalloc 的其他地方。
  • 我不在任何地方使用 malloc,其他任何地方都有“new”后有一个删除,除了这里。
  • 顺便说一句,向量不为您删除指针的原因是,如果删除了,那么您将无法存储 分配的指针带有new,或者当向量被销毁时您不想删除。
  • 你提到你有一个基类。这个基类有虚析构函数吗?

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


【解决方案1】:

为什么你的向量中需要指针?我没有看到太多你的代码,但是如果你的 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

【讨论】:

  • 程序使用派生类,将派生类存储到vector中会使其丢失该信息,因此需要指针。
  • 略有变化(可能更有效):accounts.push_back(SavingAccount()); inFile &gt;&gt; accounts.back();
  • @user1623990 你应该使用std::unique_ptr 然后将其存储在你的std::vector 或使用boost::vector_ptr
  • @MartinJames:由于堆栈不在线程之间共享,基于堆栈的对象不需要锁定,从而使线程更容易。除此之外,即使在单线程代码中,它们也更容易处理,因此应该是默认设置。
  • @MartinJames:“堆对象可以通过指针安全轻松地进行通信”什么?
【解决方案2】:

要么使用std::vectorstd::unique_ptr&lt;SavingAccount&gt;,要么循环遍历向量,在向量超出范围或被删除之前删除所有元素。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      在销毁向量之前删除存储在向量中的SavingAccount*

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

      【讨论】:

        猜你喜欢
        • 2019-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-06
        • 2017-07-25
        • 2012-09-08
        • 1970-01-01
        相关资源
        最近更新 更多