有谁知道这有什么不对?当它试图在非空堆栈上使用析构函数时,它一直给我一个“Assertion Failed”_BLOCK_TYPE_IS_VAILD(pHead-> nBlockUse) 编辑:更多代码:
class stack
{
private:
struct StackNode
{
int x;
int y;
StackNode *next;
};
StackNode *top;
public:
stack()
{ top = NULL; }
~stack();
stack::~stack()
{
StackNode *nodePtr,*nextNode;
nodePtr=top;
while (nodePtr!=NULL)
{
nextNode=nodePtr->next;
delete nodePtr;
nodePtr=nextNode;
}
}
的main.cpp
mouse_position.push(mouse_x,mouse_y);
print_stack(mouse_position);
void print_stack(stack m)
{
int tempx=0;
int tempy=0;
// while(!m.isEmpty()){
// m.pop(tempx,tempy);
cout<<tempx<<tempy<<endl;
// }
}
答案 0 :(得分:4)
从您发布的代码中,似乎问题是缺少的复制构造函数。请考虑以下代码:
stack mouse_position;
// fill mouse_position
print_stack(mouse_position);
当您致电print_stack
时,您会对mouse_position
进行按位复制。当print_stack
退出时,该副本(即m
)将被销毁,在其top
成员上调用delete,该成员的完全相同 top
mouse_position
。删除mouse_position
后,您将删除其top
两次。
然后,在你还没有发布的代码中潜伏着更多的bug。
答案 1 :(得分:2)
要注意的一些事项:
stack
有两种定义
析构函数。class
stack
的右括号。std::stack
和
std::list
。修改帖子以显示更多背景信息以获取更详细的帮助。
答案 2 :(得分:2)
您在传递到print_stack
并且没有遵循三个What is The Rule of Three?规则时复制您的筹码会导致双重删除和您的问题。
除非您将此作为练习,否则请使用std::stack
- 它已经过多年的测试和调试。