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

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

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

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

于 2011-09-27T20:52:57.007 回答
1

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

  • 最小的性能开销
  • 通过疯狂的错误搜索节省了大量的调试/故障排除时间
于 2011-09-27T20:54:19.857 回答