1

Ideleteがポインターのベクトルである場合、その中deleteのポインターで呼び出されますか? 例えば:

vector<Obj *> v = new vector<Obj *>();
v.push_back(new Obj());
delete v;

この後、 もObj削除されますか?

4

5 に答える 5

5

ベクターが破棄されると、含まれている各要素が破棄されます。ポインタは破棄されると何もしないため、メモリがリークdeleteされ、個別に呼び出されません。

より良い解決策は、使用することですstd::unique_ptr

vector<std::unique_ptr<Obj> >

unique_ptr破棄されると、それが指しているオブジェクトを削除します。

于 2012-12-05T23:30:57.853 に答える
4

いいえ、違います。ベクトルがどのように機能するかを考えると、それは理にかなっています。ベクターは、その要素を格納するためにメモリを動的に割り当ててから、それらをコピーします。

そのタイプが何であるかがわからないため、内部メモリストアで呼び出すと、ポインタが参照するものではなく、各ポインタdeleteを格納するために使用されるメモリで delete を呼び出します。たとえば、次のようなものを書いた場合...

int **a = new int*[10];
for(int i = 0; i < 10; ++i)
    a[i] = new int(i);

delete [] a;

aは解放されていますが、各ポインターが参照するメモリはどうですか? 漏れています。ポインター自体を格納するために使用されるメモリの割り当てを解除しただけです。あなたが求めているようなことを試みたとしても、あなたはそれを望まないでしょう. 特定のポインタが参照するメモリが安全に呼び出せるかどうかをベクトルがどのように知ることができるdeleteでしょうか? できません。

これが、ポインターのベクトルを使用しない理由です。代わりに、スマート ポインターのベクトルを優先します。つまり、

std::vector<unique_ptr<my_type>> vec;
于 2012-12-05T23:29:51.363 に答える
1

いいえ、ベクトルを反復処理して、その中の要素を削除する必要があります。

于 2012-12-05T23:29:24.277 に答える
0

ブーストライブラリには次のものがありますptr_vector: http://www.boost.org/doc/libs/1_52_0/libs/ptr_container/doc/ptr_vector.html
まさにそれを行います。

vectorそれ自体は、すぐに含まれるオブジェクトのデストロクタをアクティブにするだけです。この場合、デストロクタを持たない生の C ポインタが含まれています。

于 2012-12-05T23:33:23.617 に答える
0

stl_vector.h の ~vector() のドキュメントからコピー:

The dtor only erases the elements, and note that if the elements themselves are pointers, the pointed-to memory is not touched in any way. Managing the pointer is the user's responsibility.

いいえ。

于 2012-12-05T23:33:44.707 に答える