さまざまなC++プログラムで、次のように宣言および使用されるオブジェクトが表示されることがあります。
object *obj = new object;
obj->action();
obj->moreAction();
//etc...
単に行うのではなく、それを行うことの利点はありますか?
object obj;
obj.action();
obj.moreAction();
//etc
さまざまなC++プログラムで、次のように宣言および使用されるオブジェクトが表示されることがあります。
object *obj = new object;
obj->action();
obj->moreAction();
//etc...
単に行うのではなく、それを行うことの利点はありますか?
object obj;
obj.action();
obj.moreAction();
//etc
はい-ポインタをコンテナに格納するか、関数から返すことができます。ポインタがスコープ外になっても、オブジェクトは破棄されません。ポインタが使用されます
これは無料ではありません。オブジェクトが不要になったときに手動でオブジェクトを破棄する必要があり(delete
)、この瞬間がいつ来るかを判断するのは必ずしも簡単ではありません。さらに、コーディングを忘れる可能性もあります。
最初の形式であるヒープにオブジェクトを割り当てると、オブジェクトのライブ時間を完全に制御(および完全に責任obj
)することができます。明示的に削除する必要があります。
obj
2番目の形式では、スコアがなくなると(現在のコードブロックを離れるとき)、オブジェクトは自動的かつ取り消し不能に破棄されます。
誰も言及していないもう1つの理由。
スタックは通常1Mbであるため、大きなオブジェクトの作成はヒープ上で実行する必要があります(新規の場合)
基本的に、オブジェクトを作成するスコープの存続期間を超えて存続させたい場合にのみ、「新規」を使用する必要があります。例:
X* g(int i) { /* ... */ return new X(i); } // the X outlives the call of g()
オブジェクトをスコープ内にのみ存在させたい場合は、「new」を使用せずに、変数を定義するだけです。
{
ClassName x;
// use x
}
問題のオブジェクトのライフサイクルをより細かく制御できるようになります(を使用する場合new
)。
はい、正当な理由があります。後者の形式を使用すると、正しいプログラムを使用できる可能性がはるかに高くなります。
問題は、前者の形式(ポインター)がC
ismであるC++
ということです。スマートポインターを使用して、オブジェクトの寿命が尽きたときにオブジェクトが適切に破棄されるようにする必要があります。
さて、あなたが使うstd::auto_ptr<Object> obj(new Object());
ならあなたには3つの利点があります:
反対の方法で尋ねることができます:あなたはいつ奇妙な最初のオプションを使うべきですか?基本的に、大きなオブジェクトを割り当てたい場合は、それを行う必要がなく、スタックに配置できる場合は、はるかに高速なオプションになります。これは、すべてのオブジェクトを配置するJAVAよりもC++を使用する主な利点の1つです。ヒープ上。この利点は、小さなオブジェクトの多くの割り当てを処理する場合に特に当てはまります。速度を上げるために、それらをスタックに配置します。ポインタの間接参照にはコストのオーバーヘッドがあります。このような割り当てを管理するためのツールを提供するブーストプールライブラリに関する情報は、ここにあります。