我目前正在用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;
};
答案 0 :(得分:0)
我看到第一眼看上去没有泄漏。但您可以根据插入循环编号轻松地为行星指定一个唯一的名称,并在析构函数中打印该名称。
这样您就可以测试是否所有行星都被删除了。
答案 1 :(得分:0)
在修复了一些编译时错误并将循环计数减少到合理的范围后,我只用valgrind在我的Linux机器上运行了代码。检测到的唯一泄漏valgrind是泄漏的PlanetarySystemContainer
。在程序退出之前,您不会删除它。
无论如何,正如我在评论中提到的,为什么要通过创建自定义容器来重新发明轮子?在我看来,标准容器也将满足您的需求。最后利用std::unique_ptr<>
之类的东西来自动化内存管理,或者只是在容器中存储PlanetarySystem
个对象,而不是指向它们的指针,以避免管理内存的需要。