C++ 一个谎言要了我的命
在运行期间,我不断得到_BLOCK_TYPE_是有效的(phead->nBlockUse)。我花了3个小时来摆弄它,发现它不知何故是由析构函数引起的?我发现当我的堆栈为空时,就没有问题了。但当有什么事情发生时,它给了我这个错误。我在网上查看了我的析构函数,我不知道发生了什么。这是我所有的密码 编辑:我修复了错误,但现在有运行时错误 .cpp 我试过了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) {
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;
}