4

ベクターメンバー変数を含むクラスがあります。スタックに格納されたベクトルがスコープ外になるとクリーンアップされる (つまり、メモリが解放される) ことは知っていますが、ベクトル メンバー変数を含むクラス オブジェクトの破棄が行われると見なされるかどうかはわかりません。範囲外。

そうでない場合、ベクトルを破壊する適切な方法は何ですか?

例えば:

class fred {
    char *stuff;
    vector<int> v;

    fred() : stuff(), v() {}
    ~fred() {
         if (stuff) free(stuff);
         // now how do I clear up the vector v?  Will it be done automatically?
    }
 }
4

4 に答える 4

7

ベクターは既にクリーンアップされています。クラスが破棄されると、そのメンバーのすべてのデストラクタも呼び出されます。この場合v、 のデストラクタが呼び出され、割り当てられたものはすべてクリーンアップされます。

非静的メンバーの dtors は、}宣言された順序とは逆の順序でデストラクタの終了に達すると呼び出されます。次に、存在する場合は、基本クラスのデストラクタが呼び出されます。

于 2012-06-12T03:28:20.293 に答える
0

オブジェクトを破棄する方法は常に1つだけであり、それはそのデストラクタによるものです(対照的に、オブジェクトはいくつかの方法で作成できます)。STLコンテナは、データ構造内のメモリのこのようなマイクロ管理を回避するために特別に設計されました。STLコンテナでメモリを明示的に割り当てたり解放したりする必要がある場合は、それが間違っています。

于 2012-06-12T07:06:11.657 に答える
0

ベクターに対して DTOR を呼び出す必要はないと思います。オブジェクトがスコープ外になるとすぐに DTOR が呼び出されます。つまり、fred の DTOR が呼び出されます。

于 2012-06-12T05:49:21.157 に答える
0

fred のインスタンスを破棄すると、ベクターのデストラクタが呼び出されます。

于 2012-06-12T03:28:05.517 に答える