【问题标题】:segfault to a null pointer C++段错误到空指针 C++
【发布时间】:2013-04-19 20:32:24
【问题描述】:
WordBinaryTree::WordBinaryTree()
{
   //RootNode is a private WordNode* of WordBinaryTree()
   RootNode = 0; //just to set it to null...
}

void WordBinaryTree::AddNode(WordNode node)
{
  //RootNode is WordNode*, should be null the first time through
  WordNode* currNode = RootNode;

  if (!currNode)
  {
     currNode = new WordNode();
     currNode->Value = node.Value;
     currNode->Word = node.Word;
     RootNode = currNode;
     return;
  }

  while (1)
  {
     if (currNode->Value > node.Value) 
     //other code here......

我不太确定我的代码到底有什么问题。我在网上搜索过,没有任何解决方案。 WordNode 是一个类型结构,而 RootNode 只是一个指向它的指针。我从来没有为 RootNode 设置 new,所以它第一次运行时只是一个空指针。但是,当我尝试检查它是否为空(通过 currNode)时,它不断出现错误并说它不为空。因此,第一个 if 语句永远不会通过。当 while 循环中的 if 语句发生时,这会导致段错误,因为它试图从空指针获取值。

为什么会这样?我尝试了 valgrind,但它只是告诉我没有 malloc/free/etc。通过 RootNode 所在的地址。我知道!如果它为空(通过该 if 语句),我正在尝试创建一个新的,但它只是不断出现错误,就好像 RootNode 不是真的为空一样。那我该怎么办?

【问题讨论】:

  • 用else代替return是个好办法。
  • 我认为更多的代码,就像所有的都在这里发布会更好。

标签: c++ pointers null segmentation-fault nodes


【解决方案1】:

确保您之前已将 RootNode 初始化为 null:

WordNode* RootNode=NULL;

如果这样做了,请确保之前已调用此构造函数并且您对已初始化的实例进行操作

【讨论】:

  • 是的,我确实在构造函数中尝试过(两种方式): WordBinaryTree::WordBinaryTree() { RootNode = 0; } 和 WordBinaryTree::WordBinaryTree() : RootNode(0) { }
  • 我一定会做错吗?呵呵……我想通了。 WordBinaryTree 没有设置为 new,因为我将它放在另一个类的构造函数体中。因此,它的构造函数没有被正确调用以将 RootNode 设置为空......换句话说,我必须将我的新 WordBinaryTree() 放在我的代码的另一个区域。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-18
  • 2016-02-24
  • 2010-10-21
  • 2021-04-09
  • 1970-01-01
相关资源
最近更新 更多