未初始化的矢量指针不为NULL
Uninitialized vector pointer is not NULL
在我将代码从纯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++11
在g++-5
上编译),我的向量在声明之后似乎不再是NULL。已跳过标记的行。
这是c++标准实现的问题吗?或者这种奇怪的行为是从哪里来的?
未初始化的指针具有未确定的行为。可能是NULL
,也可能不是,这取决于编译器(即使对于特定的编译器,Release
和Debug
二进制文件也可能有不同的行为)和/或内存状态(请参阅本文的注释)。
建议始终初始化它们。不要期望未初始化的变量具有特定的值(指针也是如此,但其他类型(如int
、bool
)也是如此,这些类型可能根据编译器/目标采用不同的默认初始化值)。
事实上,很难知道一个单位化变量的值是多少,而且在许多情况下,它是不确定的。
本地POD变量由隐式初始化。在您的Windows实现中,它只是碰巧为null,这是一个危险的代码。
使用显式初始化:
Network* m_network = 0 ;
相关文章:
- 当使用通配符和null指针调用函数时,对输出的说明
- 当目标指针不是基类的类型时,为什么允许dynamic_cast为多态类生成 null 指针?
- 将位数组转换为 HBITMAP 后 bmBits 的 NULL 指针
- 在访问类的树层次结构中的对象时避免使用 null 指针
- 排序时引用绑定到 'value_type' 类型的 null 指针
- NULL指针解决方案中的C 分割故障
- 取消引用会导致崩溃,即使对于非 NULL 指针也是如此,原因也是如此
- 跟进哈希表 C++,this->next = NULL 指针
- C++中的NULL指针
- 当删除NULL指针(C/C )时,可以保证SegFault
- 引用绑定到类型 'struct value_type' 的 null 指针
- 尝试在C++中使用 NULL 指针时不会发生分段错误
- if(NULL==指针)和if(指针==NULL)之间有什么区别
- 在Linux/GCC下,将NULL指针访问转换为C++异常
- NULL指针检查线程安全
- cppcheck null指针取消引用:m_buffer-否则,针对null进行检查是多余的
- strtok() - 为什么必须传递 NULL 指针才能获取字符串中的下一个标记
- Null指针异常(int Vs char)
- 用户定义类中的Null指针无效
- 不是NULL指针,而是错误的访问错误消息