16

オブジェクトを使用し続ける必要がないように->、代わりにオブジェクトを直接操作するには、次のことを実行することをお勧めします。

obj x = *(new obj(...));
...
delete &obj;
4

4 に答える 4

31

これは単なる悪い習慣ではありませんが、次のようになります。

  1. 式によって作成された元のオブジェクトのコピーobjを格納し、によって返されたそのオブジェクトへのポインターが失われるため、メモリ リーク (提供したコードからは見えないパターンを使用している場合を除く) 。newnew
  2. 最も重要なことは、未定義の動作deleteです。これは、で割り当てられていないオブジェクトへのポインターに渡しているためですnew。C++11 標準のパラグラフ 5.3.5/2 によると:

[...] 最初の選択肢 (オブジェクトの削除) では、delete のオペランドの値は、ヌル ポインター値、前のnew-expressionによって作成された非配列オブジェクトへのポインター、またはサブオブジェクトへのポインターである可能性があります。 (1.8) そのようなオブジェクトの基本クラスを表す (第 10 節)。そうでない場合、動作は undefinedです。

于 2013-05-13T17:34:01.360 に答える
9

いいえ、実際、これはリークにつながります。xcopy initializedであるため、 が指す元のオブジェクトnew objは失われます。

使うだけ

obj x(...);

動的割り当ては必要ありません。または

obj x = obj(...);

あなたがしなければならない場合(それを疑う)。

于 2013-05-13T17:33:51.120 に答える