Почему C ++ std :: list :: clear () не вызывает деструкторы?

Посмотрите на этот код:

class test
{
public:
test() { cout << "Constructor" << endl; };
virtual ~test() { cout << "Destructor" << endl; };
};

int main(int argc, char* argv[])
{
test* t = new test();
delete(t);
list<test*> l;
l.push_back(DNEW test());
cout << l.size() << endl;
l.clear();
cout << l.size() << endl;
}

А затем посмотрите на этот вывод:

    Constructor
Destructor
Contructor
1
0

Вопрос в том, почему деструктор элемента списка не вызывается в l.clear()?

6

Решение

Ваш список указателей. У указателей нет деструкторов. Если вы хотите, чтобы вызывался деструктор, попробуйте list<test> вместо.

12

Другие решения

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

Вы должны предпочесть test t; над test * t = new test(); Вы очень редко хотите иметь дело с любым указателем, который владеет ресурсом, умным или другим.

Если бы вы использовали std::list «реальных» элементов, а не указателей на элементы, у вас не было бы этой проблемы.

3