私は関数を持っており、いくつかのオブジェクトをグローバルリストに保存したいと思います。 両方の方法が正常に動作します。しかし、両方ともヒープ上に変数を作成しますか? それらの違いは何ですか?ヘルプヒープ変数かどうか| *新しいObject()||オブジェクト()?
DrTosh
私は関数を持っており、いくつかのオブジェクトをグローバルリストに保存したいと思います。 両方の方法が正常に動作します。しかし、両方ともヒープ上に変数を作成しますか? それらの違いは何ですか?ヘルプヒープ変数かどうか| *新しいObject()||オブジェクト()?
DrTosh
を両ベクトルに格納し、ベクター自体がどのように自由ですそれらを保存したいが、通常フリーストアを使用する。大きな違いはしかしあり
:
vector.push_back(* new object());
これは、動的にobject
オブジェクトを割り当て、ベクター中のオブジェクトのコピーを保存し、新たに割り当てられたobject
を指し示すポインタは、その後すぐに破棄されます。
delete
object
に割り当てたアドレスがnew
ではないため、後で使用するためにアドレスを保存しないため、この方法ではメモリリークが発生します。
vector.push_back(object());
これはあなたのベクトルにオブジェクトを追加する「正しい」方法である、コピーして保存されたベクトルにして、破壊され、一時的なobject
を作成します。
new object()
ため
vector.push_back(* new object());
vector.push_back(object());
tyが動的な記憶域期間を持つ匿名の一時変数を作成します。
* new object()
は、new object()
からのポインタを保存しないので、単に参照解除してpush_back
に渡すだけなので、恐ろしいメモリリークが発生します。
so do notそうです。
一方、object()
は、匿名の暫定の自動保存期間のです。
これは間違っている:
vector.push_back(* new object());
はそれをしないでください。 new
はすべてdelete
と一致させる必要があり、あなたはそれを呼び出さないので、メモリがリークしています。あなたができる最良のことは決してnew
に電話することではありません。
これはOKです:
vector.push_back(object());
しかし、C++ 11には、あなたがより簡単に行うことができます。
vector.emplace_back(/*any constructor args go here*/);
は、彼らが
object* temp = new object();
vector.push_back(*temp);
object temp;
vector.push_back(object);
それはvector
とは何の関係もありませんが、ちょうど何delete
が呼び出されていない、次のコードに似ています(そして、あなたがすることはできません)
なぜdownvote? –
可能な重複の[なぜC++のプログラマは 'new'の使用を最小限に抑えるべきですか?](0120-1875-100) –
'vector'は' std :: vector