0

在我将代码从纯 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 Compiler 将代码移动到我的 Mac 之后(我正在编译) g++-5-std=c++11我的向量在声明后似乎不再为 NULL。标记的行被跳过。

这是一个 c++ 标准实现问题还是这个奇怪的行为来自哪里?

4

2 回答 2

2

未初始化的指针具有未确定的行为。可能是NULL也可能不是,这取决于编译器(甚至对于特定的编译器,Release二进制Debug文件可能有不同的行为)和/或内存状态(参见这篇文章的评论)。

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

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

于 2015-12-20T17:26:29.990 回答
1

本地 POD 变量由 隐式初始化。在您的 Windows 实现中,它碰巧是空的,而且是危险的代码。

使用显式初始化:

Network* m_network = 0 ;
于 2015-12-20T17:31:19.557 回答