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

use*_*990 1 c++ memory pointers memory-leaks vector

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

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

    accounts.push_back(savingAccount);
}
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:

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

    accounts.clear();
}
Run Code Online (Sandbox Code Playgroud)

清理代码添加.

编辑:已解决

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

Ton*_*ion 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.
    }
Run Code Online (Sandbox Code Playgroud)

编辑

看到OP说他有一个多态的类结构,那么OP应该使用a std::unique_ptr并将其存储在std::vector或考虑使用boost::ptr_vector哪个用于存储指针.

  • @MartinJames:由于堆栈不是在线程之间共享的,因此基于堆栈的对象不需要锁定,从而使线程更容易.除此之外,即使在单线程代码中,它们也很容易处理,因此应该是默认的. (4认同)
  • 轻微变化(可能更有效):`accounts.push_back(SavingAccount()); inFile >> accounts.back(); ` (3认同)
  • @MartinJames:"堆栈对象可以通过指针安全轻松地进行通信"___什么?___ (3认同)
  • 该程序使用派生类,将派生类存储到向量中将使其丢失该信息,因此需要指针. (2认同)