今天我遇到了一个奇怪的情况,我的未初始化指针自动初始化为NULL。
示例代码
class A
{
public:
A(): ptr1(NULL) {}
void Fun()
{
if (ptr2 != NULL && ptr2->Status())
{
...
...
}
}
private:
XYZ* ptr1;
ABC* ptr2;
};
当我将代码与现有项目集成时,由于野指针(ptr2),它在if条件下开始崩溃。然后我恢复了我的代码,并在构造函数中放置了一个断点,我可以看到这个指针(ptr2)初始化为NULL !!!如何发生这种情况,没有人初始化这个指针,它在不同的PC(Ubuntu)中运行,在过去1年多没有任何问题?
答案 0 :(得分:4)
ptr2
不同, ptr1
确实没有被构造函数初始化。
因此,读取该指针值的行为(更不用说解除引用) undefined 。这种未定义行为的一个表现形式是你的编译器为你设置nullptr
,另一个崩溃。
是时候将构造函数更改为
了A(): ptr1(nullptr), ptr2(nullptr) {}
答案 1 :(得分:2)
读取未初始化指针的值会调用未定义的行为。
默认情况下,指针是未初始化的(在很多情况下),但有可能它们偶然获得NULL
。在发布模式和调试模式下生成的代码可能不同,这就是您看到不同行为的原因。
尝试在构造函数中初始化它们:
A() : ptr1(0), ptr2(0) {}
此外,知道你被困在Heisenbug中很有意思。
答案 2 :(得分:1)
如何发生这种情况,没有人初始化这个指针并且它正在运行 在不同的PC(Ubuntu)中,过去1年多没有任何问题?
您的应用程序工作了这么长时间有几种可能的原因。
此功能分配的内存自动初始化为 零。
在某些条件下,具有未定义行为的代码仍然可以完美运行,直到这些条件发生变化。