是否应该将构造函数体中赋值的指针成员初始化为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查找节省了大量的调试/故障排除时间
相关文章:
- 从成员指针到整个结构/类的强制转换
- OOP 中的单成员指针
- 使用结构成员指针在C++中填充结构
- 聚合初始化,将成员指针设置为同一结构成员
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 共享 C++ 的数据成员指针
- 如何声明指向成员内容的成员指针m_pmd/m_pmf并访问它们?
- 从类C++外部调用指向成员方法的成员指针
- 结构成员指针是否自动初始化为零?
- 如何删除类内类类型的类成员指针
- 是否打印指向已定义 int 的成员指针
- 指向常量的成员指针
- 通过此指针访问时的成员差异和自身的成员指针(简单的 QT 示例问题)
- 类数据成员指针的非类型模板参数包无法使用 gcc 编译
- 为什么我不能在同一行中定义两个相同类型的类的成员指针
- 将类成员指针传递给 Lambda 捕获列表 c++11
- 在单一实例类中将成员指针设置为 null 的正确方法是什么
- 无法删除在destructor中的成员指针的课程
- 删除对象而不调用成员指针的析构函数
- 当派生类的基类具有成员指针时,对其进行深层复制