2012-11-30 24 views
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的幫助下,程序似乎正在泄漏內存。我對此很困惑。這是否意味着刪除是不必要的(可能是第二次刪除釋放的內存?我不確定)使用智能指針時,代碼如何崩潰?

+2

你爲什麼不把'xmlRead *'放在scoped_ptr中呢?或者更好的是,爲什麼不使用自動變量而不是動態分配? –

+0

我不認爲你發佈的代碼就足夠了,例如你如何分配xr?你爲什麼不在你的類中使用智能指針(如果複製語義可用,也許是一個shared_ptr)? –

+0

@AlessandroTeruzzi xr的內存分配在onTimeStepOp的構造函數中,如下所示:xr = new xmlReader(fileName);我如何將其更改爲shared_ptr樣式?我的意思是,如何初始化它,因爲它是類的成員? – user957121

回答

4

一個智能指針只會調用它所持有的實例的析構函數。如果該實例碰巧有其他動態分配的成員,那些不清理自動(除非你在智能指針持有他們呢!)

所以你的情況,保持成員在一個智能指針太(boost::scoped_ptrboost::shared_ptr等)

相關問題