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

时间:2011-09-27 20:47:57

标签: c++ pointers constructor initializer-list ctor-initializer

假设我有:

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

  private:
    Something *something_;
}

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

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

3 个答案:

答案 0 :(得分: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
{
}

答案 1 :(得分:2)

一般来说 - 没有。但是,如果构造函数指针中的某个位置在初始化之前使用,那么您将获得未定义的行为。但是,您遇到的最大问题是 - 如果在构造函数中抛出异常,则不会调用其析构函数。因此,假设您有两个指向对象的指针,并且第二个分配失败时第一个对象的分配成功,在这种情况下,您最终会出现资源泄漏。这可以通过使用“智能”指针来解决。但在这种情况下,它们将在初始化列表中初始化,如果您不想为它们分配值两次,那么您最好在那里而不是在构造函数体中分配内存。

答案 2 :(得分:1)

没有必要,特别是如果你在构造函数体中立即初始化,但是如果初始化不那么明显那么为什么不使用NULL来避免意外访问未初始化的变量。

  • 最低性能开销
  • 通过疯狂的bug搜索节省了大量的调试/故障排除时间