Как правильно освободить список указателей на пару? - PullRequest
0 голосов
/ 28 мая 2018

В моей программе на С ++ у меня есть эта переменная:

std::list<std::pair<MyClass,MyClass>*>* myList = 
    new std::list<std::pair<MyClass,MyClass> * >() 

Как правильно удалить всю информацию этой структуры, чтобы избежать утечек памяти?Я думаю сделать в этом режиме:

list<pair<MyClass,MyClass>*>::iterator it;
for(it = myList->begin(); it != myList->end(); it++){
    delete *it;
}
delete myList;

Это правильный подход?

Ответы [ 3 ]

0 голосов
/ 28 мая 2018

Скорее всего, вам также нужно будет удалить первый ("Stato") элемент каждой пары, используя вызов типа

delete (*it).first;
0 голосов
/ 28 мая 2018

Эта структура данных немного кошмарна:

std::list<std::pair<MyClass,MyClass> * > *

Это указатель на список (который является указателем на головной и хвостовой узлы), где узлы в списке являются указателями,Таким образом, чтобы получить доступ к первому элементу, вы должны разыменовать три указателя.Это не хорошо ни для скорости, ни для использования памяти.

Упрощение:

std::list<std::pair<MyClass,MyClass> >
0 голосов
/ 28 мая 2018

Ваш текущий код верен, он удалит все.

Однако я бы порекомендовал вам не создавать свой список динамически, поскольку он уже сохраняет свои внутренние данные динамически.Затем используйте std::unique_ptr для автоматического удаления.

Вместо:

std::list<std::pair<MyClass,MyClass> * > * myList=new std::list<std::pair<MyClass,MyClass> * >();

Это:

std::list<std::unique_ptr<std::pair<MyClass, MyClass>>> myList;

Теперь, когда вы удаляете и элемент из вашего list std::unique_ptr удалит его для вас.

Однако в вашем конкретном примере действительно нет необходимости хранить ваши элементы как указатели для начала, так какэто владеющий контейнер (ответственный за удаление его содержимого).

Так что вы можете просто сделать это:

std::list<std::pair<MyClass, MyClass>> myList;

И вообще забыть об указателях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...