0

ベクトルが所有するいくつかのオブジェクトへのポインタを保持するようにします。

ベクトルは次のとおりです。

private: std::vector<fppVirtual*> m_fapps;

次のような要素を作成しました。

    m_fapps.push_back(new fpp1(renderingEngine)); //fpp* are subclasses of fppVirtual
    m_fapps.push_back(new fpp2(renderingEngine));
    m_fapps.push_back(new fpp3(renderingEngine));

別のクラスのベクトル インスタンス変数と同様m_fappsに、クラスのデストラクタが適切にクリーンアップされるようにしたいと思いますm_fapps

       for (int i=0, size=m_fapps.size();i<size;++i){
        delete m_fapps[i];
       }

このメモリ管理手法は受け入れられますか? 所有するクラスが破棄されたときにベクトルがスコープ外になると、これらのnewオブジェクトへのポインターのみが削除されるため、このループが必要だと思いますよね?

4

3 に答える 3

3

これは機能しますが (いくつかの注意事項があります)、正当な理由により慣用的な C++ とは見なされません。

boost::ptr_vector手動のメモリ管理を行わなくても済むように、代わりにスマート ポインターのベクター (または のようなスマート ベクター) を使用することを強く検討する必要があります。

これにより、無料で例外の安全性が得られ、外部クラスがコピー可能である場合に発生する厄介な所有権の問題も回避されます。

于 2013-04-05T06:41:26.477 に答える
2

まだ誰もあなたに率直な答えを与えていないので-はい、それは受け入れられますvector..

これは、@OliCharlesworthが提案したようにスマートポインターを使用するか、@BjörnPollexによって作成された他のコンテナーを使用することで回避でき、回避する必要があります。

于 2013-04-05T06:44:41.693 に答える
1

boost::ptr_vector代わりに使用する必要があります。インターフェイスは同じですが、メモリ管理を処理します。またはを使用するかどうかに関するガイドラインについては、この質問を参照してくださいptr_vectorvector<shared_ptr<>>

于 2013-04-05T06:41:17.790 に答える