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

Uninitialized vector pointer is not NULL

在我将代码从 windows-only 平台引入 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 二进制文件也可能有不同的行为)and/or 内存状态(查看评论 post).

建议始终初始化它们。永远不要期望一个未初始化的变量有一个特定的值(这对指针来说是正确的,但对其他类型也是正确的,比如 intbool 可能会根据 compiler/target 采用不同的默认初始化值) .

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

本地 POD 变量被隐式初始化。在您的 Windows 实现中,由于运气不好,它恰好为 null 并且是危险代码。

使用显式初始化:

Network* m_network = 0 ;