是否应该将构造函数体中赋值的指针成员初始化为NULL ?

C++: Should I initialize pointer members that are assigned to in the constructor body to NULL?

本文关键字:成员 指针 初始化 NULL 赋值 函数体 是否      更新时间:2023-10-16

假设我有:

// MyClass.h
class MyClass
{
  public:
    MyClass();
  private:
    Something *something_;
}
// MyClass.cpp
MyClass::MyClass()
{
  something_ = new Something();
}

我应该在MyClass构造函数的构造函数初始化列表中将something_初始化为NULL(或0)吗?或者没有必要,因为我是在构造函数体中赋值的?推荐的做法是什么?

一般只赋值一次,在初始化列表或主体中,除非主体初始化可能发生也可能不发生,或者有先决条件代码:

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
{
}

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

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

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