C++:我应该将构造函数体中指定的指针成员初始化为NULL吗?

Use*_*ser 10 c++ constructor pointers initializer-list ctor-initializer

假设我有:

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

  private:
    Something *something_;
}

// MyClass.cpp
MyClass::MyClass()
{
  something_ = new Something();
}
Run Code Online (Sandbox Code Playgroud)

我应该在MyClass构造函数的构造函数初始化列表中初始化something_到NULL(或0)吗?或者这是不必要的,因为我在构造函数的主体中分配它?建议的做法是什么?

Moo*_*uck 11

通常,您只在初始化列表或正文中分配一次,除非正文初始化可能发生或可能不发生,或者具有先决条件代码:

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
{
}
Run Code Online (Sandbox Code Playgroud)

  • 在初始化列表中初始化具有动态分配结果的指针数据成员是一个坏主意.太多事情都可能出错.例如,如果在构造其他一些数据成员期间抛出异常,您如何知道哪些数据成员已初始化,以便您可以销毁动态分配的对象?即使您使用函数尝试块,也不知道构造失败的位置.(当然,应该使用智能指针,在这种情况下,初始化列表中的动态分配是可以的,但在使用普通指针时要小心). (5认同)
  • @User:初始化程序将按声明成员的顺序运行,而不是声明初始化程序的顺序.因此,如果您以正确的顺序声明成员,则可以具有此类依赖性. (2认同)