2012-09-21 44 views
1

我在我的程序中出现了一些内存泄漏,这是我认为唯一可能的事情。指针向量中的内存泄漏,如何防止?

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

清理代码。

编辑:议决

我的问题并没有太多做的载体,因为它没有类的析构函数。由于我没有定义虚拟析构函数,只有基类正在被擦除,留下了派生类的片段。添加后没有内存泄漏。

+0

你可以发布你的清理代码? –

+0

问题不清楚。 – Abhineet

+0

你写了'这是关于我认为可能的唯一事情' - 你为什么认为这可能是唯一的原因?在更仔细地查看矢量之前,请考虑使用'new'和'malloc'的其他地方。 –

回答

2

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

2

删除存储在您的矢量中的SavingAccount*,然后销毁该矢量。

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

3

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

7

为什么你需要在向量中的指针?我还没有看到太多的代码,但据我所知这下面可以很好的工作,如果你的SavingAccount类是拷贝构造:

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这是专为存储指针而设计的。

+2

该程序使用派生类,将派生类存储到向量中会使其丢失该信息,从而需要指针。 – user1623990

+3

轻微变化(可能更有效):'accounts.push_back(SavingAccount()); inFile >>帐户。背部(); ' – MSalters

+0

@ user1623990你应该使用'的std :: unique_ptr'然后,和存储在'的std :: VECTOR'或使用'的boost :: vector_ptr' –