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 の助けを借りてメモリ リークを起こしているようです。私はそれについてかなり混乱しています。スマート ポインターを使用する場合、削除は不要ということですか (解放されたメモリを 2 回目に削除するのでしょうか? それについてはわかりません)、コードはどのようにクラッシュしますか?

4

1 に答える 1

4

スマート ポインターは、保持しているインスタンスのデストラクタのみを呼び出します。そのインスタンスに他の動的に割り当てられたメンバーがある場合、それらは自動的にクリーンアップされません (スマート ポインターでも保持しない限り!)

したがって、あなたの場合、スマートポインターでもメンバーを保持します(boost::scoped_ptrまたはboost::shared_ptrなど)

于 2012-11-30T11:28:47.100 に答える