2016-03-11 149 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运作信息,这是很难知道的。