0

次のようなカスタムクラスがあります。

class MyClass {

   public:
        int i;
        std:string name;

        void DoSomeStuff();

}

私のカスタムクラスのリストを持つ別のクラス:

class MyClassList {

    public:
        std::vector<MyClasss> myClassList;
}

メモリ内のすべての使用済みベクトル空間を解放するために、リスト デストラクタはどのようになりますか。

MyClassList::~MyClassList 
{
    myClassList.clear();
    delete &myClassList;
}

そのコードは正しいですか、冗長ですか、それとも間違っていますか?

助けてくれてありがとう...

4

3 に答える 3

5

何もする必要はありません。範囲外にするだけです。RAIIMyClassListは、 のインスタンスが範囲外になったときに、ベクトル メモリが確実にクリーンアップされるようにします。

于 2015-04-28T18:45:44.170 に答える
2

このコードは冗長です (そして、Cyber​​ が指摘したようにdelete、ベクトルへのアクセスが許可されていないため、正しくありません)。

deleteと で割り当てられたものは 1 回だけしか使用できないことに注意してくださいnewnew[]とも同様delete[]です。削除する必要があるメンバーを持つことは、独自のデストラクタが理にかなっているケースですが、リソース処理はスマート ポインターなどのリソース ハンドラーに任せておりstd::vector、通常はこれが適しています。

暗黙的に生成されたデストラクタは、すべてのメンバーとベースを構築の逆順で破棄します。つまり、すべてのデストラクタを正しい順序で呼び出します。したがって、のデストラクタstd::vectorが呼び出され、所有するすべてのリソースが解放されます。

この原則は適切に設計されたすべてのクラスに適用され、 RAIIとして知られています。

于 2015-04-28T18:46:34.103 に答える
0

すべてがスタック上に作成されるため、List クラスからインスタンス化したオブジェクトがスコープを離れると、暗黙のデストラクタが std::vector のデストラクタを呼び出します。独自のデストラクタを持ち、メンバー変数 vector's.clear() を使用してその内容をクリアできることを確認したい場合。削除が必要なのは、ヒープに新しいメモリを作成するときだけです! ただし、new と delete の呼び出しがクラスのプライベート メソッドにあり、両方が同じメソッドにある場合、または new がコンストラクターにあり、delete がデストラクターにある場合を除き、new と delete は使用しません。それでも、shared_ptr<> と unique_ptr<> を使用することをお勧めします。解放メソッドを使用しない場合、オブジェクトがスコープを失ったときにデストラクタが自動的に解放してメモリ リークを防ぐためです。

于 2015-04-29T01:30:13.297 に答える