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


#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;
}

当我在注释掉"问题行"的情况下运行此代码时,它会运行并将节点 10 插入树中。当我使用问题行运行它时,我看到它核心转储。

当我在没有问题行的情况下运行时,我看到主打印开头的 else 部分"创建后根为空"。问题enter code here行,"打印创建后根不为空"。

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

Node* root;

root是一个局部变量,如果不初始化,它的值将是垃圾。因此,有时它可能是空的,其他时候可能是空的。因此,如果使用它会导致未定义的行为,可能会以核心转储结束。解决方案是分配它:

Node* root = nullptr;

也:

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

如果你的代码中有未定义的行为,那么一切皆有可能,还有你描述的那种奇怪的行为。

相关内容

  • 没有找到相关文章

最新更新