2013-04-02 21 views
0

这里是给我找麻烦代码:我想不通为什么会这样对我的生活为什么在尝试将重复对象添加到std :: set时会出现这个奇怪的错误?

Relation* Relation::relation_union(Relation* r) { 
    std::set<Tuple*>::iterator it1; 
    for (it1 = tuples.begin(); it1 != tuples.end(); it1++) {           
     r->tuples.insert(*it1);   //this is where i insert into the set    
    } 
    return r; 
} 

。我用这段代码得到了一个核心转储。

以下代码可以很好地按字母顺序排列我的集合中的元组(这是字符串的向量),但我认为这是我的错误的来源,因为它不知道每个元素相同时该做什么:

编辑对代码进行了更改。

struct comp { 
    bool operator()(const Tuple * lt, const Tuple * rt) { 
     for (unsigned i = 0; i < lt->values.size(); i++) { 
      std::string strl = lt->values[i]; 
      std::string strr = rt->values[i]; 
      if (strl != strr) { 
       return (strl < strr); // compares with the length 
      } 
     } 
      return false; 
    } 

}; 

'元组' 来自下面的代码:

Relation(){ 
     name = ""; 
     schema = new Schema(); 
     tuples = std::set<Tuple*, comp>(); 
     domain = std::set<std::string>(); 
    } 

    std::string name; 
    Schema* schema; 
    std::set<Tuple*, comp> tuples; 
    std::set<std::string> domain; 
} 

这里是我的堆栈跟踪 - 这是不是非常有帮助,我:

Program received signal SIGABRT, Aborted. 
0x00007ffff753b425 in raise() from /lib/x86_64-linux-gnu/libc.so.6 
(gdb) bt 
#0 0x00007ffff753b425 in raise() from /lib/x86_64-linux-gnu/libc.so.6 
#1 0x00007ffff753eb8b in abort() from /lib/x86_64-linux-gnu/libc.so.6 
#2 0x00007ffff7b9169d in __gnu_cxx::__verbose_terminate_handler()() from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 
#3 0x00007ffff7b8f846 in ??() from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 
#4 0x00007ffff7b8f873 in std::terminate()() from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 
#5 0x00007ffff7b8f96e in __cxa_throw() from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 
#6 0x00007ffff7b3c987 in std::__throw_out_of_range(char const*)() from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 
#7 0x00007ffff7b7a453 in std::string::substr(unsigned long, unsigned long) const() from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 
#8 0x000000000040d889 in Input::getTokensValue (this=0x630460) at Input.cpp:91 
#9 0x000000000040e812 in Lex::emit (this=0x7fffffffe130, tokenType=UNDEFINED) at Lex.cpp:268 
#10 0x000000000040e12d in Lex::nextState (this=0x7fffffffe130) at Lex.cpp:106 
#11 0x000000000040e026 in Lex::generateTokens (this=0x7fffffffe130, input=0x630460) at Lex.cpp:85 
#12 0x000000000040da20 in Lex::Lex (this=0x7fffffffe130, filename=0x0) at Lex.cpp:17 
#13 0x000000000040ea3e in main (argc=1, argv=0x7fffffffe248) at main.cpp:7 

任何帮助将是非常赞赏。谢谢。

+0

'std :: set'的一半是它不存储重复项。有一套'Tuple'而不是那些指针有问题吗? – chris

+2

如果所有值相等,'comp :: operator()'返回什么? –

+0

除了@AlexChamberlain,请调高警戒级别。 – chris

回答

3
bool operator()(const Tuple * lt, const Tuple * rt) { 
    for (unsigned i = 0; i < lt->values.size(); i++) { 
     std::string strl = lt->values[i]; 
     std::string strr = rt->values[i]; 
     if (strl != strr) { 
      return (strl < strr); // compares with the length 
     } 

    } 
    return false;//EDIT 
} 
+0

我将这段代码添加到我的代码中,但是当我尝试添加重复的对象时,仍然收到了核心转储......可能会导致此问题? – amorimluc

+0

我编辑了代码,很抱歉给您带来不便。 –

+0

这不是我的错误的来源,而是我的代码正常工作的必要部分。谢谢 – amorimluc

2

comp::operator()如果所有值都相等,应返回false

struct comp { 
    bool operator()(const Tuple * lt, const Tuple * rt) { 
     for (unsigned i = 0; i < lt->values.size(); i++) { 
      std::string strl = lt->values[i]; 
      std::string strr = rt->values[i]; 
      if (strl != strr) { 
       return (strl < strr); // compares with the length 
      } 
     } 
     return false; 
    } 
}; 
0

您的比较运算符期望两个操作数的“值”成员具有相同的大小。如果rt-> values小于lt-> values,你会得到一个out-of-bounds错误(但有问题的不是来自这里)。

相关问题