Почему C++ std::list::clear() не вызывает деструкторы?
-
11-12-2019 - |
Вопрос
Посмотрите на этот код:
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()
?
Решение
Ваш список состоит из указателей.У указателей нет деструкторов.Если вы хотите, чтобы вызывался деструктор, попробуйте list<test>
вместо.
Другие советы
Лучшая альтернатива освобождению указателей с помощью delete
, или использовать что-то, что абстрагирует это (например, интеллектуальные указатели или контейнеры указателей), — это просто создавать объекты непосредственно в стеке.
Вы должны предпочесть test t;
над test * t = new test();
Очень редко приходится иметь дело с каким-либо указателем, владеющим ресурсом, умным или каким-либо еще.
Если бы вы использовали std::list
«реальных» элементов, а не указателей на элементы, у вас не возникнет этой проблемы.