1

インスタンス化されたオブジェクトは、使用後数行後に同じコンテキスト (関数) で削除されます。

それらをスタック割り当てに変更できると想定しても安全newですか、それとも特別な考慮事項がありますか?

これらのオブジェクトは比較的軽量で、大きなバッファーなどはありません。

編集 :

私が発見したもう 1 つのポイントは、オブジェクトの削除順序を制御するのが難しいことです。物事がどのように作成されるかについて、より注意を払う必要があります。

4

3 に答える 3

3

実行時の条件に応じて異なるタイプのオブジェクトを作成する場合を除き、問題はありません。つまり、次のようなものがある場合:

A* pA;
if (condition)
  pA = new B();
else
  pA = new C();

次に、ポインターに固執する必要があります。そうしないと、オブジェクトのスライスが行われ、仮想呼び出しを逃すことになります。ただし、コードが単純な場合:

A* pA = new A();
// ...
delete pA;

そうすれば、スタック割り当てをより適切に使用できます。最も明白な利点の 1 つを挙げれば、オブジェクトの作成と削除の間に例外がスローされた場合に問題が回避されます。

[編集:operator newマーク Bが彼の回答で述べているように、別の可能性は overridenです。オーバーライドの主な用途はoperator new、特定のクラスのメモリ割り当てを最適化することです。あなたの場合、これはおそらく影響しません。しかし、はい、あなたのクラスが奇妙なことをするオーバーライドoperator newを持つ可能性があり、この場合、プログラムの動作を変更することになります.]

経験則としては、必要な場合を除き、ポインターを使用しないでください。あなたが本当にそうしなければならないかどうかを決定する立場にあるのは、もちろんあなただけです。

于 2013-01-29T17:08:59.377 に答える
2

私が考えることができるいくつかの考慮事項があります。

ポインターが多態的に使用されている場合 (あなたの質問はノーを意味します)、ポインターを引き続き使用する必要があります。この場合、代わりに適切なスマート ポインターを使用するように変更します。

クラスのいずれかがoperator new内部的にオーバーライドする場合、それらのメソッドを呼び出さないようにすることで、プログラムの動作を完全に変更できます。

それ以外の場合、オブジェクトは軽量であるため、スタックベースのオブジェクトに変更すると、はるかにクリーンに見えます。

于 2013-01-29T17:41:36.747 に答える
1

それはあなたの特定の文脈に依存します。実際のコードを見ないと、具体的なアドバイスをするのは難しいです。

ただし、少なくとも呼び出しを割り当てられたのポインターの代わりにスマートポインターを使用することを検討できます(したがって、適切に call に注意を払います)。newdelete

オブジェクトが関数のスコープ内にのみ存在する場合は、boost::scoped_ptrまたは C++11 のstd::unique_ptr.

例えば

#include <memory>

void f()
{
  std::unique_ptr<SomeClass> p( new SomeClass );
  p->DoSomething();
  ....

  // No need to call delete.
  // This helps making code exception-safe, and it's useful if you return from the function 
  // from different points (so you don't have to make different delete calls to properly
  // release resources).
}

一般に、最新の C++ コードでは、直接リソース マネージャーであるクラスのクラス境界内など、生のポインターを所有することはめったに使用されませstd::unique_ptrん。独自の特別なデータ構造など

于 2013-01-29T17:22:52.523 に答える