【问题标题】:An assertion faliure is killing me断言失败正在杀死我
【发布时间】:2011-07-15 12:34:45
【问题描述】:

我在运行时不断收到 _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;

   }

}

stack::~stack() {

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


}

【问题讨论】:

  • 你真的应该在发布之前简化它。
  • 不,编辑后的代码仍然不起作用。你需要一个简单的 `while (!isEmpty()) { int x,y;流行(x,y); }` 在析构函数中。
  • @naveen 仍然错误,我需要更新头部??

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


【解决方案1】:

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

如何解决?

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

【讨论】:

  • @Muggen:好吧,他只有在堆栈不为空时才调用pop。所以它会工作。但是,是的,他在空堆栈上调用的 pop 会爆炸。
  • 我还是看不懂,你能帮忙
【解决方案2】:

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

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

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

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

【讨论】:

  • 我把这个贴进去了,但还是不行
【解决方案3】:
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-ing 你不拥有的内存。

【讨论】:

  • 编辑:while(!isEmpty()) 到 while(nodePtr!=NULL) 中是否有效?
  • @kingcong,如果您想添加新版本,请编辑您的原始帖子。在cmets上做不是很舒服:P
  • @kingcong,当你做一个delete xx 没有设置为null,它仍然包含它指向的内存地址,不同的是你可能不会使用那个现在的记忆。您需要在删除后显式设置x = null 以避免悬空指针。
【解决方案4】:

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

【讨论】:

  • 在用于中断循环的isEmpty 方法中,您正在检查top 指针。由于top 指针永远不会更新,因此您的循环永远不会终止并最终删除调用未定义行为的无效内存位置。
猜你喜欢
  • 1970-01-01
  • 2013-04-06
  • 2011-05-27
  • 2015-06-24
  • 2020-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多