0

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

    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 的帮助下泄漏内存。我对此很困惑。这是否意味着使用智能指针时不需要删除(可能是第二次删除释放的内存?我不确定)以及代码如何崩溃?

4

1 回答 1

4

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

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

于 2012-11-30T11:28:47.100 回答