指针成员数组,是否已初始化?

时间:2010-01-04 21:59:52

标签: c++ arrays pointers null initialization

如果我有

class A
{
private:
  Widget* widgets[5];
};

是否保证所有指针都为NULL,或者我是否需要在构造函数中初始化它们?所有编译器都适用吗?

感谢。

4 个答案:

答案 0 :(得分:3)

除非您这样做,否则不会初始化数组。该标准不要求对数组进行初始化。

答案 1 :(得分:2)

如果它在堆栈上或使用默认堆分配器,则不会进行初始化(尽管您可以编写自己的堆积器)。

如果是全局变量,则 零填充。

对于所有符合标准的编译器都是如此。

答案 2 :(得分:0)

这取决于平台以及如何分配或声明A的实例。如果它在堆栈或堆上,则需要显式初始化它。如果是使用placement new和自定义分配器将内存初始化为零,或者在文件范围内声明实例并且平台的空指针常量为按位0,则不会。否则,你应该。

编辑:我想我应该说明显而易见的是“不要以为这种情况发生了”。

虽然实际上答案是“它取决于平台”。该标准仅告诉您在显式初始化或在文件范围初始化时会发生什么。否则,最简单地假设您所处的环境与您希望它完全相反的环境。

如果你真的需要知道(出于教育目的或优化目的),请查阅文档并找出你可以依赖的平台。

答案 3 :(得分:0)

一般情况下,数组不会被初始化。但是,请记住,类类型对象的初始值不仅取决于类本身的定义方式(构造函数等),还可能取决于创建对象时使用的初始化程序

因此,在某些特定情况下,您的问题的答案可能取决于您在创建对象时提供的初始化程序以及编译器实现的C ++语言版本。

如果您没有提供初始化程序,则该数组将包含垃圾。

A* pa = new A;
// Garbage in the array

A a;
// Garbage in the array

如果提供()初始化程序,在C ++ 98中,数组仍将包含垃圾。但是在C ++ 03中,对象将被初始化,并且数组将包含空指针

A* pa = new A();
// Null-pointers in the array in C++03, still garbage in C++98

A a = A();
// Null-pointers in the array in C++03, still garbage in C++98

此外,具有静态存储持续时间的对象在进行任何其他初始化之前始终为零初始化。因此,如果使用静态存储持续时间定义A类的对象,则该数组最初将包含空指针。