2016-03-11 163 views
-2

我在IntList.h文件中有一個名爲IntList的基類。在SortedSet.h文件中有一個名爲SortedSet的繼承類。 的intList中具有以下結構: -分割錯誤

struct IntNode 
{ 
    int data; 
    IntNode *next; 
    IntNode(int data) : data(data), next(0) {} 
}; 

下面的代碼是在SortedSet的類友元函數。該函數返回SortedSet對象,該對象是2 SortedSet對象的並集,即此二元運算符的左側和右側操作數。

SortedSet operator|(const SortedSet &lho, const SortedSet &rho) 
{ 
    SortedSet temp; 
    IntNode* set1 = lho.head; 
    IntNode* set2 = rho.head; 

    while(set1->next != 0) 
    { 
     temp.push_back(set1->data); 
     set1 = set1->next; 
    } 

    delete set1; 

    while(set2->next != 0) 
    { 
     if (temp.in(set2->data) == false) 
     { 
      temp.push_back(set2->data); 
      //cout<<"It isn't in there"<<endl; 
     } 
     set2 = set2->next; 
    } 
    delete set2; 

    return temp; 
} 

我得到一個分段錯誤,我似乎無法修復它。任何幫助,將不勝感激。謝謝!

+6

這聽起來像你可能需要學習如何使用調試器來逐步執行代碼。使用一個好的調試器,您可以逐行執行您的程序,並查看它與您期望的偏離的位置。如果你打算做任何編程,這是一個重要的工具。延伸閱讀:** [如何調試小程序(http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** – NathanOliver

+0

你能張貼調用堆棧? – user16

+0

你是什麼意思?我如何通過main調用它? –

回答

1

代碼中的一個明顯錯誤是,當您應該測試set1不爲null時,測試set1->next不爲null。從您發佈的有限信息中很難確定這是唯一的問題,但這幾乎肯定會導致分段錯誤,所以我相對確信這是問題所在。

更改while循環看起來像這樣:

while(set1 != 0) 
{ 
    temp.push_back(set1->data); 
    set1 = set1->next; 
} 

然後摑自己在額頭上,因爲這將是非常容易使用調試器的快速應用回升。

編輯:你也應該刪除delete操作,因爲它們將始終作用於一個空指針。目前還不清楚爲什麼會想只刪除列表的元素反正所以也許你認爲你正在做的並不需要做的,雖然沒有關於SortedSet運作信息,這是很難知道的。