Вопрос по c++, list – Как правильно удалить указатель из списка std ::?

1

Я создаю объект черезnewзатем добавление указателя в список std :: list после настройки объекта.

Как правильно удалить указатель и удалить данные из списка, не вызывая утечек памяти?

Нет, вы должны использовать умные указатели. Cat Plus Plus
Какой типm_DataList ? Robᵩ
@ahendersonm_DataList содержитdatalist*неdatalistпоэтому удаление необходимо Praetorian
возможный дубликатbest way to delete a vector pointer? Synetech
Является ли дополнительный; вwhile лини опечатка, или это умышленно? Если это намеренно, то у вас есть проблема. Robᵩ

Ваш Ответ

2   ответа
3

std::list держатьdatalist экземпляры вместоdatalist* указатели, то вам не нужноdelete datalist экземпляры вручную больше. Когда вы удаляете элемент изstd::list (или любой другой контейнер STL, в этом отношении), данные элемента освобождаются автоматически для вас. Если элемент является классом / структурой с определенным деструктором, будет вызван деструктор.

Попробуй это:

std::list<datalist> m_DataList;

.

datalist AR; // <-- local variable on the stack, freed when out of scope
AR.index = ...;
AR.number = ...;
mylist.push_back(AR); // <-- pushes a copy-constructed instance of the variable

.

std::list<datalist>::iterator Iter1 = m_DataList.begin();
while(Iter1 != m_DataList.end()) 
{ 
    if (Iter1->index == m_SomeVar)     
    { 
        m_DataList.erase(Iter1); // <-- copied datalist instance is freed automatically
        break; 
    } 

    ++Iter1; 
} 
4

std::find_if

auto it = std::find_if(lst.begin(), 
                       lst.end(), 
                       [&val](datalist const &d) { return d.index == val; });

if ( it != lst.end() )
{
    delete *it;
    lst.erase(it);
}

Это не означает, что вы делаете это неправильно.

Тем не менее, ваш код улучшится, если вы решите использовать какую-то форму умных точек, таких какstd::unique_ptr, std::shared_ptrили улучшите умные указатели, тогда вам не придется самостоятельно управлять памятью.

Похожие вопросы