2011-03-15 78 views
1

没有人知道这是怎么回事?它不断给我_BLOCK_TYPE_IS_VAILD(pHead-> nBlockUse)一个 “失败的断言”,当它试图使用detructor在一个非空栈 编辑:多个代码:“断言失败”在析构函数

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; 
// } 

} 
+5

你在某处毁了你的记忆,这是不够的。你为'stack'写了一个合适的拷贝构造函数和赋值操作符吗? – 2011-03-15 20:17:45

+1

@king:你应该在这个问题中增加更多的代码,例如StackNode的定义和Stack的所有构造函数/赋值/拷贝操作符,以及你正在使用哪些代码。基本上,我们可以编译一个最小的代码示例,它会重现您的问题。 – 2011-03-15 20:20:50

+0

更多代码添加,我认为这些是主要的 – kingcong3 2011-03-15 20:25:24

回答

2

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

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

2

有些事情要看:

  1. StackNode没有析构函数。
  2. stack 析构函数有两个定义。
  3. 缺失大括号class stack
  4. 考虑将StackNode移动到 之外的类。
  5. 优选使用std::stackstd::list

编辑您的帖子以显示更多上下文以获取更详细的帮助。

4

从您发布的代码看来,问题似乎是缺少的复制构造函数。请看下面的代码:

stack mouse_position; 
// fill mouse_position 
print_stack(mouse_position); 

当你调用print_stack,你做的mouse_position位复制。当print_stack退出时,该副本(即m)被销毁,在其top成员完全相同topmouse_position上调用删除。当mouse_position被删除时,您将删除其两次top

然后,您还没有发布的代码中可能会有更多的bug存在。