12

私が持っているとしましょう:

// MyClass.h
class MyClass
{
  public:
    MyClass();

  private:
    Something *something_;
}

// MyClass.cpp
MyClass::MyClass()
{
  something_ = new Something();
}

MyClassコンストラクターのコンストラクター初期化リストでsomething_をNULL(または0)に初期化する必要がありますか?それとも、コンストラクターの本体で割り当てているので、それは必要ありませんか?推奨される方法は何ですか?

4

3 に答える 3

12

通常、本体の初期化が行われる場合と行われない場合、または前提条件コードがない場合を除き、初期化リストまたは本体で1回だけ割り当てます。

MyClass::MyClass() 
{
   //this code must happen first
   // _now_ max is known
   something_ = new Something(max);
}

MyClass::MyClass() 
{
   if (max) 
       something_ = new Something(max);
   else
       something_ = NULL;
}

MyClass::MyClass() 
    : something_(new Something()) 
//as pointed out in the comments, use smart pointers
{
}
于 2011-09-27T20:53:25.047 に答える
2

一般的に言えば-いいえ。ただし、コンストラクターポインターのどこかが初期化される前に使用されると、未定義の動作が発生します。ただし、最大の問題はこれです。コンストラクタで例外がスローされた場合、そのデストラクタは呼び出されません。したがって、オブジェクトへの2つのポインターがあり、最初のオブジェクトの割り当ては成功し、2番目の割り当ては失敗するとします。その場合、リソースリークが発生します。これは、「スマート」ポインタを使用することで解決できます。ただし、その場合、それらは初期化リストで初期化されます。値を2回割り当てたくない場合は、コンストラクター本体ではなく、そこにメモリを割り当てる方が適切です。

于 2011-09-27T20:52:57.007 に答える
1

特にコンストラクター本体ですぐに初期化する場合は必要ありませんが、初期化がそれほど明白でない場合は、初期化されていない変数への誤ったアクセスを避けるために、NULLにしないでください。

  • 最小限のパフォーマンスオーバーヘッド
  • クレイジーなバグハンティングにより、デバッグ/トラブルシューティングの時間を大幅に節約できます
于 2011-09-27T20:54:19.857 に答える