Как правильно удалить указатель из списка std ::?

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

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

 Praetorian01 июн. 2012 г., 19:01
@ahendersonm_DataList содержитdatalist*неdatalistпоэтому удаление необходимо
 Synetech02 июн. 2012 г., 02:41
возможный дубликатbest way to delete a vector pointer?
 Robᵩ01 июн. 2012 г., 18:49
Является ли дополнительный; вwhile лини опечатка, или это умышленно? Если это намеренно, то у вас есть проблема.
 Cat Plus Plus01 июн. 2012 г., 18:44
Нет, вы должны использовать умные указатели.
 Robᵩ01 июн. 2012 г., 18:44
Какой типm_DataList ?

Ответы на вопрос(2)

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; 
} 

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или улучшите умные указатели, тогда вам не придется самостоятельно управлять памятью.

Ваш ответ на вопрос