未初始化的向量指针不为 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++11
在 g++-5
上编译)我的向量在声明后似乎不再为 NULL。标记的行被跳过。
这是 C++ 标准实现问题还是这种奇怪的行为从何而来?
未初始化的指针具有未确定的行为。可能是 NULL
或不是,这取决于编译器(而且,即使对于特定的编译器,Release
和 Debug
二进制文件也可能有不同的行为)and/or 内存状态(查看评论 post).
建议始终初始化它们。永远不要期望一个未初始化的变量有一个特定的值(这对指针来说是正确的,但对其他类型也是正确的,比如 int
、bool
可能会根据 compiler/target 采用不同的默认初始化值) .
实际上很难知道单位化变量的值是多少,而且在很多情况下它是不确定的。
本地 POD 变量被隐式初始化。在您的 Windows 实现中,由于运气不好,它恰好为 null 并且是危险代码。
使用显式初始化:
Network* m_network = 0 ;
在我将代码从 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++11
在 g++-5
上编译)我的向量在声明后似乎不再为 NULL。标记的行被跳过。
这是 C++ 标准实现问题还是这种奇怪的行为从何而来?
未初始化的指针具有未确定的行为。可能是 NULL
或不是,这取决于编译器(而且,即使对于特定的编译器,Release
和 Debug
二进制文件也可能有不同的行为)and/or 内存状态(查看评论 post).
建议始终初始化它们。永远不要期望一个未初始化的变量有一个特定的值(这对指针来说是正确的,但对其他类型也是正确的,比如 int
、bool
可能会根据 compiler/target 采用不同的默认初始化值) .
实际上很难知道单位化变量的值是多少,而且在很多情况下它是不确定的。
本地 POD 变量被隐式初始化。在您的 Windows 实现中,由于运气不好,它恰好为 null 并且是危险代码。
使用显式初始化:
Network* m_network = 0 ;