容器c ++中的内存泄漏

时间:2013-11-20 20:18:34

标签: c++ memory-leaks containers

我目前正在用C ++编写一个容器,但是我遇到了内存泄漏的问题。 出于测试目的,我创建了两个版本的main: 第一个在一个循环中创建并从列表中删除对象(这里一切都好) 第二个在第一个循环中创建对象并在第二个循环中删除所有对象(在两个循环结束后它仍然是程序使用的大量内存)。

操作系统:Windows 7; IDE:CodeBlock 12.11; 编译器:GNU GCC

代码 (放在一个代码块中,对不起,如果对某人不清楚,只想让这篇帖子尽可能短)

main.cpp中:

#include <iostream>
using namespace std;
#include "planetarySystemContainer.hpp"

int main()
{
    PlanetarySystemContainer * container;
    container=new PlanetarySystemContainer();
    PlanetarySystem *planet;
    int i;
    cin>>i;
    i=0;
    for(int i=0; i<10000000; i++)
    {
        planet=new PlanetarySystem();
        planet->name("blabgs4tegser4labnab");
        container->AddAtBegining(planet);
    }
    for(int i=0; i<10000000; i++)
    {
        container->DeleteFromBegining();
    }
    cin>>i;
    return 0;
}

planetarySystemContainer.hpp:

class PlanetarySystemContainer
{
private:
    PlanetarySystem *First;
    PlanetarySystem *Last;
    int PlanetarySystemQuantity;
public:
    PlanetarySystemContainer();
    void AddAtBegining(PlanetarySystem *a);
    void DeleteFromBegining();
};


planetarySystemContainer.cpp

#include"planetarySystemContainer.hpp"
PlanetarySystemContainer::PlanetarySystemContainer()
    :First(NULL)
    ,Last(NULL)
    ,PlanetarySystemQuantity(0)
{
}

void PlanetarySystemContainer::AddAtBegining(PlanetarySystem *a)
{
    a->SetPrevious(NULL);
    a->SetNext(First);
    First=a;
    if(a->GetNext()==NULL)
        Last=a;
    PlanetarySystemQuantity++;
}

void PlanetarySystemContainer::DeleteFromBegining()
{
    if(First!=NULL )
    {
        if(First->GetNext()!=NULL)
        {
            PlanetarySystem* x=First;
            First=First->GetNext();
            First->SetPrevious(NULL);
            delete x;
        }
        else
        {
            PlanetarySystem* x=First;
            First=NULL;
            Last=NULL;
            delete x;
        }
        PlanetarySystemQuantity--;

    }
}

planetarySystem.hpp:

#include <iostream>

class PlanetarySystem
{
private:
    PlanetarySystem* Next;
    PlanetarySystem* Previous;
    unsigned int PlanetQuantity; //ilosc obiektow w ukladzie (planet+stacji+asteroid)
public:
    PlanetarySystem();
    string name;
    PlanetarySystem *GetNext();
    PlanetarySystem *GetPrevious();
    void SetNext(PlanetarySystem *ps);
    void SetPrevious(PlanetarySystem *ps);
    int GetPlanetQuantity();
};

planetarySystem.cpp:

#include "planetarySystem.hpp"

PlanetarySystem::PlanetarySystem()
    :Next(NULL)
    ,Previous(NULL)
    ,PlanetQuantity(0)
{

}

PlanetarySystem *PlanetarySystem::GetNext()
{
    return Next;
}

PlanetarySystem *PlanetarySystem::GetPrevious()
{
    return Previous;
}

void PlanetarySystem::SetNext(PlanetarySystem *ps)
{
    Next=ps;
}

void PlanetarySystem::SetPrevious(PlanetarySystem *ps)
{
    Previous=ps;
}

int PlanetarySystem::GetPlanetQuantity()
{
    return PlanetQuantity;
};

2 个答案:

答案 0 :(得分:0)

我看到第一眼看上去没有泄漏。但您可以根据插入循环编号轻松地为行星指定一个唯一的名称,并在析构函数中打印该名称。

这样您就可以测试是否所有行星都被删除了。

答案 1 :(得分:0)

在修复了一些编译时错误并将循环计数减少到合理的范围后,我只用valgrind在我的Linux机器上运行了代码。检测到的唯一泄漏valgrind是泄漏的PlanetarySystemContainer。在程序退出之前,您不会删除它。

无论如何,正如我在评论中提到的,为什么要通过创建自定义容器来重新发明轮子?在我看来,标准容器也将满足您的需求。最后利用std::unique_ptr<>之类的东西来自动化内存管理,或者只是在容器中存储PlanetarySystem个对象,而不是指向它们的指针,以避免管理内存的需要。