2014-11-02 4 views
0

Предположим, у меня есть список, как такойОпорожнение содержимое списка

std::list<foo*> lst; 

Если я следующее:

lst.clear 

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

for(
    std::list<foo*>::iterator listMyClassIter = lst.begin(); 
    listMyClassIter != lst.end(); 
    listMyClassIter ++) { 
    delete listMyClassIter; } 

lst.clear(); //Now clear the content 
+0

Некоторые вопросы: на что указывают указатели? Какова продолжительность жизни этих объектов? Кто их владеет, если кто? – juanchopanza

+1

Ваш цикл 'for' правильно подходит. Однако, если вам это нужно в более чем одной точке, ваш код быстро станет спагетти. Чтобы смягчить эту проблему, по крайней мере, оберните эту логику в объект, который отвечает за управление временем жизни объектов, на которые указывают элементы 'vector'. – 5gon12eder

ответ

3

Ваш список указателей и указателей не имеют деструкторов. Это означает, что вы должны явно удалять указатели в контейнере.

редактироваться ВОПРОС редактируется: -

Если вы хотите, чтобы ваш список автоматически управлять памятью для вас, то вы можете использовать повышение :: shared_ptr вместо хранения необработанных указателей.

Вы можете сделать одно из следующих сырых указателей: -

for (...) { delete *it; } m_list.clear(); 

ИЛИ

for (...) { delete *it; m_ilist.erase(); } 
+0

Но, возможно, нет. Не все указатели должны иметь для них 'delete'. – juanchopanza

+0

Спасибо за указатель. – MistyD

+0

Работает ли мой подход. Обновлено мое сообщение – MistyD

1

Поскольку вы используете указатель в качестве элемента, деструктор не будет называться.

Смежные вопросы