9

看看这段代码:

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()

4

2 回答 2

14

你的清单是指针。指针没有析构函数。如果你想调用析构函数,你应该尝试list<test>

于 2012-09-30T22:14:11.900 回答
4

使用 释放指针或使用将指针抽象出来的东西(例如智能指针或指针容器)的更好替代方法delete是直接在堆栈上创建对象。

你应该更喜欢test t;test * t = new test();很少想要处理任何拥有资源的指针,无论是智能的还是其他的。

如果您要使用std::list“真实”元素,而不是指向元素的指针,则不会出现此问题。

于 2012-10-01T02:19:25.617 回答