Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指针数组成员,是否已初始化?_C++_Arrays_Pointers_Null_Initialization - Fatal编程技术网

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

C++ 指针数组成员,是否已初始化?,c++,arrays,pointers,null,initialization,C++,Arrays,Pointers,Null,Initialization,如果我有 class A { private: Widget* widgets[5]; }; 是保证所有指针都为空,还是需要在构造函数中初始化它们?所有编译器都是这样吗 谢谢。除非您这样做,否则阵列不会初始化。标准不要求初始化数组。除非您这样做,否则数组不会初始化。该标准不要求初始化数组。这取决于平台以及如何分配或声明A的实例。如果它在堆栈或堆上,则需要显式初始化它。如果使用placement new和自定义分配器将内存初始化为零,或者您在文件范围内声明了一个实例,并且平台的null指针常

如果我有

class A
{
private:
  Widget* widgets[5];
};
是保证所有指针都为空,还是需要在构造函数中初始化它们?所有编译器都是这样吗


谢谢。

除非您这样做,否则阵列不会初始化。标准不要求初始化数组。

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

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

编辑:我想我应该说一句显而易见的话,那就是“不要假设这会发生”

尽管事实上答案是“取决于平台”。该标准仅告诉您在显式初始化或在文件范围内初始化时会发生什么。否则,很容易假设您所处的环境与您希望它做的完全相反


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

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

编辑:我想我应该说一句显而易见的话,那就是“不要假设这会发生”

尽管事实上答案是“取决于平台”。该标准仅告诉您在显式初始化或在文件范围内初始化时会发生什么。否则,很容易假设您所处的环境与您希望它做的完全相反


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

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

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


这适用于所有一致性编译器。

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

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


这适用于所有一致性编译器。

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

<> P> >在某些特殊情况下,对问题的回答可能取决于在创建对象时提供的初始化器和编译器实现的C++语言版本。p> 如果不提供初始值设定项,数组将包含垃圾

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

此外,具有静态存储持续时间的对象总是在进行任何其他初始化之前进行零初始化。因此,如果您定义了一个具有静态存储持续时间的
类的对象,那么数组最初将包含空指针。

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

<> P> >在某些特殊情况下,对问题的回答可能取决于在创建对象时提供的初始化器和编译器实现的C++语言版本。p> 如果不提供初始值设定项,数组将包含垃圾

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

此外,具有静态存储持续时间的对象总是在进行任何其他初始化之前进行零初始化。因此,如果您定义了一个具有静态存储持续时间的
类的对象,那么数组最初将包含空指针。

因此,如果您做额外的工作,它将保证为空。换句话说,不,它们在所有正常情况下都不是空的。我会说它不一定是空的,或者说,它永远不能保证是空的,但它可能碰巧是空的。哇!因此,如果你做额外的工作,它保证为空。换句话说,不,它们在所有正常情况下都不是空的。我会说它不一定是空的,或者说,它永远不能保证是空的,但它可能碰巧是空的。哇!