Question

Look at this code:

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

And then, look at this output:

    Constructor
    Destructor
    Contructor
    1
    0

The question is: Why is the destructor of the list element not called at l.clear()?

Was it helpful?

Solution

Your list is of pointers. Pointers don't have destructors. If you want the destructor to be called you should try list<test> instead.

OTHER TIPS

A better alternative to freeing pointers using delete, or using something that abstracts that away (such as a smart pointers or pointer containers), is to simply create the objects directly on the stack.

You should prefer test t; over test * t = new test(); You very rarely want to deal with any pointer that owns a resource, smart or otherwise.

If you were to use a std::list of 'real' elements, rather than pointers to elements, you would not have this problem.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top