我们应该删除析构函数中的成员指针,尽管使用boost :: scoped_ptr?

时间:2012-11-30 11:27:07

标签: c++ memory smart-pointers

最近我了解到使用智能ptr可以让我们的工作更轻松。我试着将boost :: scoped_ptr添加到我的代码中。但是,我不确定是否应该删除指向class的指针。这是我的代码:

    class onTimeStepOp : public QWidget
    {
        public:
            //some function here
            ~onTimeStepOp(){delete xr;}
        private:
            xmlReader *xr;
            //others.
    };

for(int i = m; i >= 1; --i) {
    boost::scoped_ptr<onTimeStepOp> otso(new onTimeStepOp(
                                             QString::number(currentFrameNum - i),  
                                             QString::number(currentFrameNum)   
                                             ));  
    //do something here.
}

似乎otso会在范围的末尾调用它的析构函数。所以我在课堂上添加了析构函数。该程序在运行后崩溃。然而,没有析构函数,似乎程序在Valgrind的帮助下泄漏了内存。我很困惑。是否意味着删除是不必要的(可能是第二次删除释放的内存?我不确定)使用智能指针时代码是如何崩溃的?

1 个答案:

答案 0 :(得分:4)

智能指针只会调用它所持有的实例的析构函数。如果该实例碰巧有其他动态分配的成员,那么这些成员不会被自动清理(除非您将它们保存在智能指针中!)

因此,在您的情况下,也要将成员保持在智能指针中(boost::scoped_ptrboost::shared_ptr等)。