4

さまざまなC++プログラムで、次のように宣言および使用されるオブジェクトが表示されることがあります。

object *obj = new object;
obj->action();
obj->moreAction();
//etc...

単に行うのではなく、それを行うことの利点はありますか?

object obj;
obj.action();
obj.moreAction();
//etc
4

7 に答える 7

5

はい-ポインタをコンテナに格納するか、関数から返すことができます。ポインタがスコープ外になっても、オブジェクトは破棄されません。ポインタが使用されます

  • オブジェクトの不要なコピーを避けるために、
  • オプションのオブジェクト作成を容易にするために、
  • カスタムオブジェクトの有効期間管理の場合、
  • 複雑なグラフのような構造を作成するために、
  • 上記の組み合わせの場合。

これは無料ではありません。オブジェクトが不要になったときに手動でオブジェクトを破棄する必要があり(delete)、この瞬間がいつ来るかを判断するのは必ずしも簡単ではありません。さらに、コーディングを忘れる可能性もあります。

于 2010-02-17T15:20:30.630 に答える
3

最初の形式であるヒープにオブジェクトを割り当てると、オブジェクトのライブ時間を完全に制御(および完全に責任obj)することができます。明示的に削除する必要があります。

obj2番目の形式では、スコアがなくなると(現在のコードブロックを離れるとき)、オブジェクトは自動的かつ取り消し不能に破棄されます。

于 2010-02-17T15:22:46.593 に答える
2

誰も言及していないもう1つの理由。
スタックは通常1Mbであるため、大きなオブジェクトの作成はヒープ上で実行する必要があります(新規の場合)

于 2010-02-17T15:26:39.727 に答える
1

基本的に、オブジェクトを作成するスコープの存続期間を超えて存続させたい場合にのみ、「新規」を使用する必要があります。例:

X* g(int i) { /* ... */ return new X(i); } // the X outlives the call of g()

オブジェクトをスコープ内にのみ存在させたい場合は、「new」を使用せずに、変数を定義するだけです。

{
    ClassName x;
    // use x
}
于 2010-02-17T15:21:23.057 に答える
0

問題のオブジェクトのライフサイクルをより細かく制御できるようになります(を使用する場合new)。

于 2010-02-17T15:22:46.483 に答える
0

はい、正当な理由があります。後者の形式を使用すると、正しいプログラムを使用できる可能性がはるかに高くなります。

問題は、前者の形式(ポインター)がCismであるC++ということです。スマートポインターを使用して、オブジェクトの寿命が尽きたときにオブジェクトが適切に破棄されるようにする必要があります。

さて、あなたが使うstd::auto_ptr<Object> obj(new Object());ならあなたには3つの利点があります:

  1. これで、オブジェクトのライフサイクルを明示的に管理できます(ただし、忘れることはできません)。
  2. オブジェクトをポリモーフィズムのあるコンテナに格納できます
  3. スタックを詰まらせないため、スタックオーバーフローに遭遇するリスクが少なくなります
于 2010-02-17T15:52:25.683 に答える
0

反対の方法で尋ねることができます:あなたはいつ奇妙な最初のオプションを使うべきですか?基本的に、大きなオブジェクトを割り当てたい場合は、それを行う必要がなく、スタックに配置できる場合は、はるかに高速なオプションになります。これは、すべてのオブジェクトを配置するJAVAよりもC++を使用する主な利点の1つです。ヒープ上。この利点は、小さなオブジェクトの多くの割り当てを処理する場合に特に当てはまります。速度を上げるために、それらをスタックに配置します。ポインタの間接参照にはコストのオーバーヘッドがあります。このような割り当てを管理するためのツールを提供するブーストプールライブラリに関する情報は、ここにあります。

于 2013-03-15T00:46:52.523 に答える