В настоящее время я пишу контейнер в C++, но в нем возникает проблема с утечкой памяти. В целях тестирования я создал две версии main: сначала создал и удалил объект из списка в одном цикле (все здесь ОК). Второй создайте объект в первом цикле и удалите все из них во втором (после окончания обеих циклов он все еще много памяти, используемой программой).
ОС: Windows Seven; 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;
};
Я только что запустил ваш код на моем ящике Linux с помощью valgrind после исправления некоторых ошибок времени компиляции и сокращения числа циклов до чего-то разумного. Единственным обнаруженным утечкой является утечка PlanetarySystemContainer
. Вы не удаляете его до выхода программы.
Независимо от того, как я упоминал в своем комментарии, почему вы изобретаете колесо, создавая пользовательский контейнер? Мне кажется, что стандартные контейнеры также будут удовлетворять ваши потребности. Наконец, используйте средства, такие как std::unique_ptr<>
чтобы автоматизировать управление памятью или просто хранить объекты PlanetarySystem
в контейнере, а не указатели на них, чтобы избежать необходимости управлять памятью.
Я не вижу утечки при первом взгляде. Но вы можете легко дать планете уникальное имя на основе его номера цикла вставки и напечатать имя в деструкторе.
Таким образом, вы можете проверить, удалены ли все планеты.