0

したがって、Object 型のクラスへのポインターのベクトルを格納する List というクラスがあります。リストには、オブジェクト クラスを初期化し、そのポインターをベクターに追加する add という関数があります。add 関数が終了すると、 Object クラスが破棄され、ポインターにアクセスすると例外が発生すると考えました。これをテストするテスト プログラムを作成したところ、Object クラスが破棄されていないことがわかりました。

関数内で初期化されたクラスは、関数が終了すると破棄されますか?

クラスはいつ自動的に破棄されますか?

4

2 に答える 2

4

オブジェクトの作成方法によって異なります。このようにしている場合:

void add() {
  Object obj;
  vec.push_back(&obj);
}

次に、自動保存期間objで作成しています。つまり、関数が終了すると破棄されます。ベクトルにプッシュしたポインターは、有効な を指しなくなるため、絶対にこれを行わないでください。addObject

ただし、これを行っている可能性があります。

void add() {
  Object* obj = new Object();
  vec.push_back(obj);
}

その場合、動的ストレージ期間Objectを使用して を作成しており、関数の最後に破棄されません。ベクトルに挿入したポインターは有効なままです。ただし、これを行うと、後でオブジェクトに覚えておく必要があります。そうしないと、漏れが発生します。delete

最善の選択肢は、可能であればポインターをまったく使用しないことです。ベクトルを astd::vector<Object>にして、そこにオブジェクトをコピーするだけです:

void add() {
  vec.push_back(Object());
}

または C++11 の場合:

void add() {
  vec.emplace_back();
}

本当にポインタが必要な場合は、スマート ポインタを使用してください。

于 2012-12-14T18:57:15.120 に答える
-1

C++ では、メモリ マネージャー、スマート ポインター、またはある種の「管理された」環境を使用しない場合、キーワードnewを使用してクラスが作成されます。誤解を避けるために、Object とメソッド List.Add のコンストラクタを投稿していただけますか?

したがって、次のような新しいオブジェクトを作成する場合:

Object* o = new Object();

ヒープにスペースを確保し、そのスペースへのポインターをポインター 'o' に格納します。あなたが電話したことがないなら

delete o;

明示的にあなたのオブジェクトは決して削除されません。

于 2012-12-14T19:07:08.827 に答える