C++ 一个谎言要了我的命

C++ 一个谎言要了我的命,c++,class,data-structures,stack,linked-list,C++,Class,Data Structures,Stack,Linked List,在运行期间,我不断得到_BLOCK_TYPE_是有效的(phead->nBlockUse)。我花了3个小时来摆弄它,发现它不知何故是由析构函数引起的?我发现当我的堆栈为空时,就没有问题了。但当有什么事情发生时,它给了我这个错误。我在网上查看了我的析构函数,我不知道发生了什么。这是我所有的密码 编辑:我修复了错误,但现在有运行时错误 .cpp 我试过了 stack::~stack() ////PROBLEM STILL HERE?? { while (this) {

在运行期间,我不断得到_BLOCK_TYPE_是有效的(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() {


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

如何修复


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

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

如何修复


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

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

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

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

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

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

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

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

  while (nodePtr)
  {
    nextNode = nodePtr->next;
    delete nodePtr;
    nodePtr = nextNode;
  }
}
这两者似乎有点错误。假设你的
堆栈
不是空的。这意味着
top
指向某个地方(因此不是
null
)。为了让析构函数停止访问内存,你应该使用
isEmpty()
检查顶部的
null
。但是在这段代码中,
top
永远不会设置为
null
。迟早你会开始
删除你不拥有的内存



这两者似乎有点错误。假设你的
堆栈
不是空的。这意味着
top
指向某个地方(因此不是
null
)。为了让析构函数停止访问内存,你应该使用
isEmpty()
检查top中的
null
。但是在这段代码中,
top
永远不会设置为
null
。迟早你会开始
删除你不拥有的内存。

问题出在析构函数中,因为你没有更新top。你不需要再次编写删除元素的代码,只需在
循环中调用
pop
函数。

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

您确实应该在发布之前简化它。不,编辑的代码是till不起作用。您需要在析构函数中使用一个简单的`while(!isEmpty()){int x,y;pop(x,y);}`来进行解构。@naveen仍然出错,我需要更新head??您确实应该在发布它之前对其进行简化。不,编辑的代码仍然不起作用。您需要一个简单的`while(!isEmpty()){int x,y;pop(x,y);}`在析构函数中。@naveen仍然出错,我需要更新head???@Muggen:嗯,只有当堆栈不是空的时候,他才调用
pop
。所以它会工作。但是是的,他调用空堆栈的pop会爆炸。我似乎仍然无法得到它,你会吗help@Muggen:嗯,只有当堆栈不是空的时候,他才会调用
pop
。所以它会工作的。Bu是的,他在空堆栈上调用的pop将失败。我似乎仍然无法获得它,你能帮忙吗?将:while(!isEmpty())编辑为while(nodePtr!=NULL)工作?@kingcong,如果你想添加一个新版本,请编辑你的原始帖子。在评论上这样做不是很舒服
:P
@kingcong,当你执行
删除x
时,
x
没有设置为空,它仍然包含它指向的内存地址,不同的是你现在可能不使用该内存。你需要在删除后显式设置
x=null
,以避免指针悬空。编辑:while(!isEmpty())到while(nodePtr!=null)也是如此工作?@kingcong,如果你想添加一个新版本,请编辑你的原始帖子。在评论上这样做不是很舒服
:P
@kingcong,当你执行
删除x
时,
x
没有设置为空,它仍然包含它指向的内存地址,不同的是你现在可能不使用该内存。你需要要在删除后显式设置
x=null
,以避免指针悬空。我粘贴了这个,但仍然没有goi我粘贴了这个,但仍然没有goi在用于中断循环的
isEmpty
方法中,您正在检查
top
指针。因为
top
指针从未更新过,所以循环永远不会终止并以d结束删除调用未定义行为的无效内存位置。在用于中断循环的
isEmpty
方法中,您正在检查
top
指针。由于
top
指针从未更新,因此循环从未终止,并最终删除调用未定义行为的无效内存位置。
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;

}