繁体   English   中英

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

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

假设我有:

// 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搜索节省了大量的调试/故障排除时间

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM