Вопрос

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

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 «реальных» элементов, а не указателей на элементы, у вас не возникнет этой проблемы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top