我在运行时期间一直得到_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); }
}
答案 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
- 你不拥有的记忆。