Idelete
がポインターのベクトルである場合、その中delete
のポインターで呼び出されますか? 例えば:
vector<Obj *> v = new vector<Obj *>();
v.push_back(new Obj());
delete v;
この後、 もObj
削除されますか?
Idelete
がポインターのベクトルである場合、その中delete
のポインターで呼び出されますか? 例えば:
vector<Obj *> v = new vector<Obj *>();
v.push_back(new Obj());
delete v;
この後、 もObj
削除されますか?
ベクターが破棄されると、含まれている各要素が破棄されます。ポインタは破棄されると何もしないため、メモリがリークdelete
され、個別に呼び出されません。
より良い解決策は、使用することですstd::unique_ptr
vector<std::unique_ptr<Obj> >
unique_ptr
破棄されると、それが指しているオブジェクトを削除します。
いいえ、違います。ベクトルがどのように機能するかを考えると、それは理にかなっています。ベクターは、その要素を格納するためにメモリを動的に割り当ててから、それらをコピーします。
そのタイプが何であるかがわからないため、内部メモリストアで呼び出すと、ポインタが参照するものではなく、各ポインタ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;
いいえ、ベクトルを反復処理して、その中の要素を削除する必要があります。
ブーストライブラリには次のものがありますptr_vector
: http://www.boost.org/doc/libs/1_52_0/libs/ptr_container/doc/ptr_vector.html
まさにそれを行います。
vector
それ自体は、すぐに含まれるオブジェクトのデストロクタをアクティブにするだけです。この場合、デストロクタを持たない生の C ポインタが含まれています。
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.
いいえ。