断言失败正在扼杀我

时间:2011-03-15 04:47:51

标签: c++ class data-structures stack linked-list

我在运行时期间一直得到_BLOCK_TYPE_IS_VALID(phead-> nBlockUse)。我花了3个小时搞乱它,发现它是以某种方式由析构函数引起的?我弄清楚的是,当我的堆栈是空的时,没有问题。但是当有什么东西时,它给了我这个错误。我在线检查了我的析构函数,我不知道发生了什么。这是我的所有代码。

编辑:我修复了错误,但现在有运行时错误......?

的.cpp 我试过了

stack::~stack() ////PROBLEM STILL HERE??
{
     while (this)
   {

         top=top->next;
         int x,y;
         pop(x,y);
   }

}

stack::~stack()
{

   StackNode *nodePtr, *nextNode;
   nodePtr = top;
     while (nodePtr)
        {
      nextNode = nodePtr->next;
      delete nodePtr;
      nodePtr = nextNode;

   }

}

堆::〜堆()     {

while (!isEmpty()) 
{ int x,y; pop(x,y); }


}

4 个答案:

答案 0 :(得分:2)

是。问题出在析构函数中。您正在删除那里的节点,但您没有更新top指针。因此,isEmpty()会在检查top的值时发生故障。

如何解决?

您已经注意删除pop函数中的节点,为什么要复制析构函数中的逻辑?继续从析构函数中调用pop,直到堆栈不为空。

答案 1 :(得分:2)

问题在于析构函数,因为您没有更新顶部。您无需再次编写用于删除元素的代码,只需在pop循环中调用while函数即可。

答案 2 :(得分:1)

仔细观察析构函数和IsEmpty()之间的交互。 IsEmpty()检查top是否为null,但是在删除头节点后,析构函数永远不会更新。

我可能会像这样编写析构函数:

stack::~stack()
{
  StackNode *nodePtr, *nextNode;
  nodePtr = top;

  while (nodePtr)
  {
    nextNode = nodePtr->next;
    delete nodePtr;
    nodePtr = nextNode;
  }
}

答案 3 :(得分:1)

stack::~stack()                   //PROBLEM HERE??
{
   StackNode *nodePtr, *nextNode;
   nodePtr = top;
     while (!isEmpty())
   {
      nextNode = nodePtr->next;
            delete nodePtr;
      nodePtr = nextNode;

   }

}
bool stack::isEmpty()
{

   if (!top)
      return true;
   else
      return false;

}

这两个看起来有些不对劲。想象一下,你的stack不是空的。这意味着top指向某处(因此不是null)。为了让析构函数停止访问内存,它不应该使用isEmpty()来检查顶部的null。但在这段代码中,top永远不会设置为null。迟早你会开始delete - 你不拥有的记忆。