vector
を使用して割り当てられてから逆参照された要素の束がaに含まれている場合、それらの要素のメモリは、が削除さnew
れたときに解放されますか?vector
例えば:
vector<Obj> a = *(new vector<Obj>());
a.push_back(*(new Obj()));
delete &a;
作成された新しいObj
ものは割り当てが解除されていますか?
vector
を使用して割り当てられてから逆参照された要素の束がaに含まれている場合、それらの要素のメモリは、が削除さnew
れたときに解放されますか?vector
例えば:
vector<Obj> a = *(new vector<Obj>());
a.push_back(*(new Obj()));
delete &a;
作成された新しいObj
ものは割り当てが解除されていますか?
これはすべてひどく間違っているでしょう。まず、最初の行の割り当て「a」がスタックにあり(ヒープではありません)、new
ステートメントによって割り当てられたメモリが失われ、リークされ、なくなっています。
第二に、同じ状況の再発。Obj()が作成され、コピーされます。あなたの2番目からの記憶はnew
、永遠に、空間と時間の深さで失われました。
次に、スタックに割り当てられたオブジェクトを削除しようとします。これはあなたのプログラムがクラッシュして燃える場所であり、そのすべてのメモリ損失は重要ではありません。
vector<Obj> a;
Obj o;
a.push_back(o);
注:いいえ、new
またはdelete
見えません。C++はJavaではありません。
いいえ; あなたは一般的に所有権に問題を抱えているようです。この宣言では:
vector<Obj> a = *(new vector<Obj>());
あなたは新しいものを割り当て、vector
それをコピーし、そしてオリジナルを捨てています。ポインタがなくなったため、削除できません。これはメモリリークと呼ばれます。さらに、これ:
delete &a;
new
を介して割り当てられたオブジェクトを削除するのではなく、ローカルを削除するため、未定義の動作です。あなたがおそらく意味したのはこれでした:
vector<Obj*> a;
// ...
つまり、vector<Obj>
という名前のローカルを割り当てます。このローカルa
のストレージは、スコープ外になると自動的に再利用されます。
さて、あなたの実際の質問については、いいえ、vector
ポインタを所有しているのは唯一のポインタであり、ポインタが指すメモリは所有していません。そうでなければ何が起こるかを考えてください:
vector<Obj*> a;
Obj x;
a.push_back(&x);
すべてのポインタ要素でvector
呼び出された場合、破棄されたとき(これも自動的に)も削除されます。を介して割り当てられていないため、これは未定義の動作です。幸いなことに、これは当てはまりません!delete
a
x
new
が破棄されたときに指示対象を自動的に破棄するポインタのベクトルが必要な場合は、次vector
のベクトルを使用しますunique_ptr
。
vector<unique_ptr<Obj>> a;
a.push_back(unique_ptr(new Obj()));
パーツはvector<Obj> a
、スタックに空のベクトルを割り当てます。
= *(new vector<Obj>());
ヒープに別の空のベクトルを割り当て、それをスタックベクトルに割り当てます(コピーします)。ヒープに割り当てられたメモリには参照がなく、リークされています。
a.push_back(*(new Obj()));
ヒープにを割り当て、Obj
スタックベクトルにコピーします。ヒープに割り当てられたメモリがリークしています。
delete &a;
エラーであるスタックに割り当てられたベクトルを削除しようとします。
多分これはあなたがやろうとしていることです:
vector<Obj*>* a = new vector<Obj*>();
a.push_back(new Obj());
delete a;
いいえ、ベクターにプッシュバックされたオブジェクトは割り当てが解除されず、リークされます。ベクトルポインタa
でdeleteを呼び出すと、デフォルトで、動的に割り当てられたメモリの割り当て解除を伴わないベクトルが分解されます。
ヒント:ネイキッドポインターは使用せず、unique_ptrまたはshared_ptrを使用することをお勧めします。
いいえ。*(new Obj())
ステートメントは、ヒープに割り当てられたオブジェクトのコピーを(ベクトルに)プッシュします。コピーされたオブジェクト(ベクター内)は後で破棄されます(ベクターが破棄されたとき)が、元のヒープ割り当てObjオブジェクトが削除されることはありません(ヒープ割り当てメモリが解放されることはありません)。