-1

vectorを使用して割り当てられてから逆参照された要素の束がaに含まれている場合、それらの要素のメモリは、が削除さnewれたときに解放されますか?vector例えば:

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

作成された新しいObjものは割り当てが解除されていますか?

4

5 に答える 5

10

これはすべてひどく間違っているでしょう。まず、最初の行の割り当て「a」がスタックにあり(ヒープではありません)、newステートメントによって割り当てられたメモリが失われ、リークされ、なくなっています。

第二に、同じ状況の再発。Obj()が作成され、コピーされます。あなたの2番目からの記憶はnew、永遠に、空間と時間の深さで失われました。

次に、スタックに割り当てられたオブジェクトを削除しようとします。これはあなたのプログラムがクラッシュして燃える場所であり、そのすべてのメモリ損失は重要ではありません。

于 2012-12-05T19:57:34.747 に答える
5
vector<Obj> a;
Obj o;
a.push_back(o);

注:いいえ、newまたはdelete見えません。C++はJavaではありません。

于 2012-12-05T20:22:12.000 に答える
3

いいえ; あなたは一般的に所有権に問題を抱えているようです。この宣言では:

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呼び出された場合、破棄されたとき(これも自動的に)も削除されます。を介して割り当てられていないため、これは未定義の動作です。幸いなことに、これは当てはまりません!deleteaxnew

が破棄されたときに指示対象を自動的に破棄するポインタのベクトルが必要な場合は、次vectorのベクトルを使用しますunique_ptr

vector<unique_ptr<Obj>> a;
a.push_back(unique_ptr(new Obj()));
于 2012-12-05T20:03:06.670 に答える
0

パーツは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を使用することをお勧めします。

于 2012-12-05T20:05:13.977 に答える
0

いいえ。*(new Obj())ステートメントは、ヒープに割り当てられたオブジェクトのコピーを(ベクトルに)プッシュします。コピーされたオブジェクト(ベクター内)は後で破棄されます(ベクターが破棄されたとき)が、元のヒープ割り当てObjオブジェクトが削除されることはありません(ヒープ割り当てメモリが解放されることはありません)。

于 2012-12-05T19:58:23.027 に答える