2

重複の可能性:
C++ STL で vector を含む動的に割り当てられたオブジェクトを削除する

私はこのような構造体を持っています

struct foo {
  vector<int> myvector;
};

ここで、foo へのポインターを作成し、サイズを変更していくつかの要素をベクターに挿入します。

foo *myfoo = new foo;
myfoo->myvector.resize(100);
myfoo->myvector.push_back(0);
myfoo->myvector.push_back(1);
... // and so on

ここで、myfoo がスコープ外になる前に、それに割り当てられたメモリの割り当てを解除する必要があります。

delete myfoo;

私の質問は、これで myvector も解放されるかどうかです。myvector のサイズが変更されたので、STL ライブラリはおそらくヒープにコンテナーを割り当てるため、この特定のクエリがあります。したがって、myfoo を解放するときに、myvector に割り当てられたメモリがリークすることは望ましくありません。

4

4 に答える 4

7

はい、削除すると、.myfooを含むすべてのメンバーも破棄されますstd::vector。内部fooにポインターがある場合、ポインターのみが破棄され、ポインターが指すオブジェクトは破棄されないことに注意することが重要です (もちろん、そのジョブを実行するデストラクタを定義した場合を除きます。そうする必要があります)。

デストラクタの実行後、非静的データ メンバーも破棄されることが標準で義務付けられています (§12.4/8)。

デストラクタの本体を実行し、本体内に割り当てられた自動オブジェクトを破棄した後、 classのデストラクタは、の直接の非バリアント非静的データ メンバーのデストラクタ、の直接の基本クラスのXデストラクタを呼び出します。最も派生したクラス (12.6.2) の型であり、そのデストラクタはの仮想基本クラスのデストラクタを呼び出します。XXXX

fooユーザー宣言のデストラクタが定義されていないため、クラスにはデフォルトのデストラクタがあります (§12.4/4):

クラスにユーザー宣言のデストラクタがない場合、デストラクタは暗黙的にデフォルトとして宣言されます (8.4)。

のデストラクタは、 d のmyfooときに呼び出されますdelete(§5.3.5/6):

delete-expressionのオペランドの値がnull ポインター値でない場合、delete-expressionは、削除されるオブジェクトまたは配列の要素のデストラクタ (存在する場合) を呼び出します。

削除式は、次の形式の式です。

::opt delete キャスト式

于 2012-12-07T22:11:36.067 に答える
4

を呼び出すdelete fooと、 のすべてのメンバーのデストラクタ (該当する場合) の割り当てが解除されて呼び出されるfooので、そうです。このように機能しないと、言語を使用するのがはるかに難しくなります。

于 2012-12-07T22:13:06.487 に答える
3

構造体 foo は、ベクトルのコンテナーを保持するだけです。とにかく、ベクターのアイテムは個別に(通常はヒープ上に)割り当てられます。

ベクターのデストラクタはヒープ上の実際のベクターを削除し、オブジェクトが削除されるとベクターは破棄されます。

于 2012-12-07T22:13:25.457 に答える
2

あなたの質問に答えるコード例を次に示します。

#include <iostream>

struct bar {
    ~bar() {std::cout << "deleted bar" << std::endl;}
};

struct foo {
  bar b[10];  
};

int main() {
    foo* f = new foo();
    delete f;
}

プログラムは「削除されたバー」を 10 回出力します。

于 2012-12-07T22:50:25.450 に答える