утечка памяти в контейнере с ++

0

В настоящее время я пишу контейнер в 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;
};
  • 1
    "... программа по-прежнему использует много памяти" Для инструментов, не связанных с программированием, таких как диспетчер задач, нормально показывать большой объем используемой памяти даже после ее освобождения.
  • 0
    К сожалению, это был диспетчер задач. Не должно ли тогда произойти такая же утечка ложных срабатываний для main.cpp с одним циклом? Является ли моя пустота DeleteFromBegining (); функционировать хорошо? Я протестирую программу, используя одну из бесплатных программ обнаружения утечек памяти, настолько быстро, насколько смогу.
Показать ещё 2 комментария
Теги:
memory-leaks
containers

2 ответа

0

Я только что запустил ваш код на моем ящике Linux с помощью valgrind после исправления некоторых ошибок времени компиляции и сокращения числа циклов до чего-то разумного. Единственным обнаруженным утечкой является утечка PlanetarySystemContainer. Вы не удаляете его до выхода программы.

Независимо от того, как я упоминал в своем комментарии, почему вы изобретаете колесо, создавая пользовательский контейнер? Мне кажется, что стандартные контейнеры также будут удовлетворять ваши потребности. Наконец, используйте средства, такие как std::unique_ptr<> чтобы автоматизировать управление памятью или просто хранить объекты PlanetarySystem в контейнере, а не указатели на них, чтобы избежать необходимости управлять памятью.

  • 1
    Действительно, std :: список std :: unique_ptr
0

Я не вижу утечки при первом взгляде. Но вы можете легко дать планете уникальное имя на основе его номера цикла вставки и напечатать имя в деструкторе.

Таким образом, вы можете проверить, удалены ли все планеты.

  • 0
    Вы также можете использовать инфраструктуру модульного тестирования с обнаружением утечек памяти, например cpputest, если это позволяет вам спать лучше!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню