假设我有:
// MyClass.h
class MyClass
{
public:
MyClass();
private:
Something *something_;
}
// MyClass.cpp
MyClass::MyClass()
{
something_ = new Something();
}
我应该在MyClass构造函数的构造函数初始化列表中将something_初始化为NULL(或0)吗?或者这是不必要的,因为我在构造函数的主体中分配它?建议的做法是什么?
答案 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来避免意外访问未初始化的变量。