析构函数中的“断言失败”

时间:2011-03-15 20:15:31

标签: c++ stack

有谁知道这有什么不对?当它试图在非空堆栈上使用析构函数时,它一直给我一个“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;
//  }

}

3 个答案:

答案 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)

要注意的一些事项:

  1. StackNode没有析构函数。
  2. stack有两种定义 析构函数。
  3. 缺少class stack的右括号。
  4. 考虑将StackNode移到外面 上课。
  5. 首选使用std::stackstd::list
  6. 修改帖子以显示更多背景信息以获取更详细的帮助。

答案 2 :(得分:2)

您在传递到print_stack并且没有遵循三个What is The Rule of Three?规则时复制您的筹码会导致双重删除和您的问题。

除非您将此作为练习,否则请使用std::stack - 它已经过多年的测试和调试。