2011-03-15 70 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存在。