未初始化的矢量指针不为NULL

Uninitialized vector pointer is not NULL

本文关键字:NULL 指针 初始化      更新时间:2023-10-16

在我将代码从纯windows平台引入GNU编译器的过程中,我注意到一个未初始化的指向向量的指针出现了一些奇怪的行为。

相应的代码如下所示:

typedef vector<IPeer*> Network;
// [...]
Network* m_network;
// [...]
if (m_network == NULL)         // <-- this is the strange part
  m_network = new Network();  

划线让我很难过。在声明我的向量后,当我在Windows机器上编译它时,它是NULL。在使用GNU编译器将代码移动到我的Mac之后(我使用-std=c++11g++-5上编译),我的向量在声明之后似乎不再是NULL。已跳过标记的行。

这是c++标准实现的问题吗?或者这种奇怪的行为是从哪里来的?

未初始化的指针具有未确定的行为。可能是NULL,也可能不是,这取决于编译器(即使对于特定的编译器,ReleaseDebug二进制文件也可能有不同的行为)和/或内存状态(请参阅本文的注释)。

建议始终初始化它们。不要期望未初始化的变量具有特定的值(指针也是如此,但其他类型(如intbool)也是如此,这些类型可能根据编译器/目标采用不同的默认初始化值)。

事实上,很难知道一个单位化变量的值是多少,而且在许多情况下,它是不确定的。

本地POD变量由隐式初始化。在您的Windows实现中,它只是碰巧为null,这是一个危险的代码。

使用显式初始化:

Network* m_network = 0 ;