2
class X;

class Y {
    public:
        ~Y();
    private:
        map<int,X*> m;
        vector<X*> v;
        X* px;
};

のデストラクタは次のclass Yようになりますか?

Y::~Y() {
    delete px; 
    for (vector<X*>::iterator it = v.begin(); it!=v.end(); it++) 
    delete *it;
    v.clear();
}

しかし、どうY::mですか?

4

3 に答える 3

21

いいえ、それは完全に間違っています。リソース管理クラスを使用する代わりに、リソースを手動で削除しました。これは非常に悪いエラーです。それらを解放する責任がある場合は、代わりに、unique_ptr<X>またはshared_ptr<X>または同様のクラスが本当に必要です。X*

class Y {
    private:
        map<int,std::unique_ptr<X>> m;
        vector<std::unique_ptr<X>> v;
        std::unique_ptr<X> px;
};

これで、カスタムデストラクタは必要ありません。

于 2012-08-25T21:26:27.850 に答える
6

ベクトルは、地図は...

for (map<int, X*>::iterator it = m.begin(); it != m.end(); ++it)
   delete it->second;
于 2012-08-25T21:20:56.760 に答える
1

同じ:

for (map<int,X*>::iterator it = m.begin() ; it != m.end() ; it++ )
   delete it->second;

autoC ++ 11では、イテレータタイプをスキップするために使用できます。

v.clear();デストラクタを呼び出す必要もありません。

于 2012-08-25T21:21:20.307 に答える