最近我了解到使用智能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的帮助下泄漏了内存。我很困惑。是否意味着删除是不必要的(可能是第二次删除释放的内存?我不确定)使用智能指针时代码是如何崩溃的?
答案 0 :(得分:4)
智能指针只会调用它所持有的实例的析构函数。如果该实例碰巧有其他动态分配的成员,那么这些成员不会被自动清理(除非您将它们保存在智能指针中!)
因此,在您的情况下,也要将成员保持在智能指针中(boost::scoped_ptr
或boost::shared_ptr
等)。