0
最近我瞭解到,使用智能ptr可以使我們的工作更輕鬆。我試圖將boost :: scoped_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的幫助下,程序似乎正在泄漏內存。我對此很困惑。這是否意味着刪除是不必要的(可能是第二次刪除釋放的內存?我不確定)使用智能指針時,代碼如何崩潰?
你爲什麼不把'xmlRead *'放在scoped_ptr中呢?或者更好的是,爲什麼不使用自動變量而不是動態分配? –
我不認爲你發佈的代碼就足夠了,例如你如何分配xr?你爲什麼不在你的類中使用智能指針(如果複製語義可用,也許是一個shared_ptr)? –
@AlessandroTeruzzi xr的內存分配在onTimeStepOp的構造函數中,如下所示:xr = new xmlReader(fileName);我如何將其更改爲shared_ptr樣式?我的意思是,如何初始化它,因爲它是類的成員? – user957121