指针自动初始化为NULL

时间:2018-01-17 11:29:58

标签: c++ pointers

今天我遇到了一个奇怪的情况,我的未初始化指针自动初始化为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年多没有任何问题?

3 个答案:

答案 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年多没有任何问题?

您的应用程序工作了这么长时间有几种可能的原因。

  • 某些编译器/运行时在调试版本中将所有内存初始化为零。也许你已经改变了编译标志?
  • 当您的应用程序从操作系统请求其他内存页面时,这些页面通常会清零,以防止从先前运行的应用程序中泄漏任意数据。有关Windows的信息,请参阅VirtualAlloc
      

    此功能分配的内存自动初始化为   零。

  • 您可能已经更新了一些内存分配器,现在它的工作方式略有不同。

在某些条件下,具有未定义行为的代码仍然可以完美运行,直到这些条件发生变化。