使用全局变量时的核心转储

时间:2017-03-29 21:05:41

标签: c++ global-variables coredump

#include <iostream>

int sizeWhileBuilding = 0;
int sizeWhileCounting = 0;

struct Node
{
   Node( int theData ) :
      data( theData ), left( NULL ), right( NULL )
   { std::cout << "Node::Node() with data " << theData << std::endl; }

   int data;
   Node* left;
   Node* right;
};

Node* insertNode( Node* root, int data )
{
   if( !root )
   {
      ++sizeWhileBuilding;
      std::cout << "Current size is " << sizeWhileBuilding << std::endl;
      std::cout << "Making new node with " << data << std::endl;
      root = new Node( data );
   }
   else if( root->data < data )
   {
      std::cout << "The node " << root->data << " is lesser than " << data << ". Making right node" << std::endl;
      root->right = insertNode( root->right, data );
   }
   else if( root->data > data )
   {
      std::cout << "The node " << root->data << " is greater than " << data << ". Making left node" << std::endl;
      root->left = insertNode( root->left, data );
   }
   return root;
}

int main()
{
   std::cout << "Making binary tree" << std::endl;

   Node* root;
   if( root )
   {
      std::cout << "Root is NOT null after creation" << std::endl;
   }
   else
   {
      std::cout << "Root is null after creation" << std::endl;
   }
   std::cout << "==============================================================================" << std::endl;
   root = insertNode( root, 10 );

//Problem line below
std::cout << "The size of the tree is " << sizeWhileBuilding << std::endl;
}

当我使用&#34;问题行&#34;运行此代码时注释掉,它运行并将节点10插入树中。当我用问题行运行它时,我发现它是coredumps。

当我在没有问题行的情况下运行时,我看到主打印开始时的else部分&#34; Root在创建后为空时#34;。对于问题enter code here行,&#34;创建打印后,Root不为null&#34;。

我不明白为什么Node * root;初始化取决于是否正在使用全局变量?

1 个答案:

答案 0 :(得分:1)

Node* root;

root是一个局部变量,如果没有初始化,它的值将是垃圾。所以有时它可能是nullptr其他任何时候。因此,如果使用它将导致可能以coredump结尾的未定义行为。解决方案是分配它:

Node* root = nullptr;

也:

  

我不明白为什么Node * root;初始化取决于是否正在使用全局变量?

如果你的代码中有未定义的行为,那么任何事情都是可能的,也就是你描述的那种奇怪的行为。