1

重複の可能性:
オブジェクトへの C++ ベクトル ポインター
std::list::remove メソッドは、削除された各要素のデストラクタを呼び出しますか?

std::vector が次のように定義されている場合:

std::vector<Object*>* myObjects;

そして、次のように呼び出します。

delete myObjects;

myObjects の要素も削除されますか? std::array またはその他の stl コンテナーを使用して違いはありますか?

前もって感謝します

4

2 に答える 2

6

いいえ、これがその理由です。

次の 2 つのケースを考えてみましょう。

int a, b, c;

auto stackvec = new vector<int*> { &a, &b, &c };
auto heapvec  = new vector<int*> { new int, new int, new int };

delete stackvec;
delete heapvec;

delete保持しているポインターで呼び出されたvector*sを呼び出すと、未定義の動作を生成する最初の自動変数を使用することになるため(悪いことです)、delete問題が山積みになります (しゃれが意図されています)。deletedelete

ポインタが動的に割り当てられていることがわかっている場合は、ポインタvectorとポインタを自分で手動で反復する必要があります。使用すると、何も呼び出す必要がありません。deletestd::unique_ptrdelete

また、そもそもaへのポインターは必要ないかもしれませんが、vectorあなたの状況がわからないので判断しません。

std::arrayとについては、コンパイル時にstd::vectorのサイズを知る必要があり、実行時にサイズを変更することはできませんが、これらの制限はありません。std::arrayvector

于 2012-06-19T17:31:46.880 に答える
1
  1. いいえ、メモリリークが発生します。
  2. いいえ、ポインタのコンテナはポイントされたオブジェクトを削除しません。
    • Boostを使用すると、データを所有するポインターのコンテナーがあります。
    • boost::ptr_vector<int>
于 2012-06-19T17:22:54.170 に答える