2013-10-05 35 views
0

我正在C++中使用STL實現樹的BFS代碼,並且我得到了一個運行時錯誤,我無法調試。如果我不打電話給printout() function,所有東西都可以正常工作。 請幫助,因爲我是新來的STL ..[錯誤]正在釋放的指針未分配

#include<iostream> 
#include<malloc.h> //on llvm we don't need this 
#include<list> 
using namespace std; 
typedef struct Node{ 
int val; 
struct Node* left; 
struct Node* right; 
}node; 
void push(node** root,int val) 
{ 
    if(!(*root)) 
    { 
     node* temp=(node*)malloc(sizeof(node)); 
     temp->val=val; 
     temp->right=temp->left=NULL; 
     *root=temp; 
    } 
    else if(val<(*root)->val) 
     push(&((*root)->left),val); 
    else 
     push(&((*root)->right),val); 
} 

void printout(node* head) 
{ 
    node* temp; 
    temp=head; 
    list<node*>qu; 

    //using bfs here 
    while(temp!=NULL) 
    { 
     cout<<temp->val<<endl; 
     if(temp->left!=NULL) 
      qu.push_back(temp->left); 
     if(temp->right!=NULL) 
      qu.push_back(temp->right); 
     temp=qu.front(); 
     qu.pop_front(); 
     //free(temp); 
    } 
} 

int main() 
{ 
node* root=NULL; 
push(&root,3); 
push(&root,4); 
push(&root,1); 
push(&root,10); 
push(&root,2); 
printout(root); 
} 

雖然它打印輸出corrent但隨着運行時間的時間

3 
1 
4 
2 
10 
a.out(613) malloc: *** error for object 0x7fff55ed8bc8: pointer being freed was not allocated 
*** set a breakpoint in malloc_error_break to debug 
Abort trap: 6 
+0

如果您想編寫標準C++,請將''替換爲'' –

回答

1

要調用在每個迭代qu.front()任何檢查qu是空的。如果它是空的 - 最終會是 - 你的代碼會中斷。

最簡單的解決辦法是檢查是否qu爲空:

if (qu.empty()) { 
    temp = NULL; 
} else { 
    temp=qu.front(); 
    qu.pop_front(); 
    //free(temp); 
} 

然而,看起來怪怪的。我會完全改變循環,並使用!qu.empty()作爲while循環的條件。

list<node*> qu; 
qu.push_back(head); 
while(!qu.empty()) { 
    node* temp = qu.front(); 
    qu.pop_front(); 
    if(temp->left) 
     qu.push_back(temp->left); 
    if(temp->right) 
     qu.push_back(temp->right); 
    //free(temp); 
} 
+0

做了同樣的事情,謝謝您的解釋:) –

1

什麼情況是,當你在樹中的最後的「葉子」,在temp->lefttemp->right都是NULL,你會得到一個空的曲名單。 調用qu.front()會在空列表上導致未定義的行爲:http://en.cppreference.com/w/cpp/container/list/front

您可以在調用front前添加大小檢查。

相關問題