Как удалить объект динамически выделенного класса в списке <T>? - PullRequest
0 голосов
/ 09 июля 2019

Я просто создаю список объектов Coordi, как показано ниже внутри функции.Coordi - это объект класса, который я определил.

list<Coordi> LstOfCoordi;
for (int i = 0; i < 10; ++i)
{
    Coordi *tmp = new Coordi();
    LstOfCoordi.push_back(tmp);
} 

Я хочу выпустить список и каждый объект в систему до завершения программы.

Если каждый элемент списка должен быть освобожден, как с этим обращаться?Я попытался использовать коды ниже, чтобы удалить каждый из них, но он сделал ошибку компиляции.

for (int i = 0; i < 10; ++i)
{
    myClass tmp = LstOfMyCalss.back();
    delete &tmp;
    LstOfMyClass.pop_back();
} 

Итак, мне интересно, удаление из списка достаточно или нет.Кратко о кодах ниже, каждый элемент был выделен, и они не освобождаются должным образом, когда список уничтожен.

for (int i = 0; i < 10; ++i)
{
    //myClass tmp = LstOfMyCalss.back();
    //delete &tmp;
    LstOfMyClass.pop_back();
} 

Пожалуйста, дайте мне знать лучший способ освободить все выделенные объекты.

1 Ответ

2 голосов
/ 09 июля 2019

Редактировать: Пример кода при создании списка объектов с использованием std :: list.

class MyClass {
public:
    std::list<Coordi> m_listCoordi;
}

//---creation of list of objects
for(int a = 0; a < numObjects; a++){
    m_listCoordi.push_back(Coordi());  //note: no 'new' is used.
}

//---destroying list of objects
m_listCoordi.clear();

Пример кода при создании списка указателей на объекты с использованием std :: list.

class MyClass {
public:
    std::list<Coordi*> m_listCoordi;  //<---note: now list of pointer
}

//---creation of list of objects
for(int a = 0; a < numObjects; a++){
    m_listCoordi.push_back(new Coordi());
}

//---destroying list of objects
for(int a = 0; a < numObjects; a++){
    delete m_listCoordi[a];  //note: an item in m_listCoordi is already a pointer.
}
m_listCoordi.clear();

Я извинился за грязный ответ.У меня не так много времени, чтобы сделать его более чистым и формальным.Надеюсь, в любом случае это поможет.


Предыдущий ответ:

Если в вашем списке, скажем, std::vector<YourClass*>, элементы содержат значения указателя.Вы несете ответственность за выделение и освобождение блока памяти из значений указателя, которые вы сохраняете в списке.Каким бы ни был ваш метод распределения / освобождения, решать вам.Просто убедитесь, что ваш код не вызовет утечек памяти.

//---deallocate all elements before clearing the list.
for(auto& pItem : LstOfMyClass){  
    //note: since LstOfMyClass is a list of pointer values, pItem is a pointer variable.
    delete pItem;
}
//---clear the list.
LstOfMyClass.clear();

Если объекты в LstOfMyClass не перемещаются или список не увеличивается или не уменьшается, лучше использовать список объектов вместо спискауказатель на объекты.При этом вам не нужно беспокоиться о распределении и освобождении.Список сделает это за вас, если переменная списка уничтожена.

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