2012-02-23 75 views
2

我在自定义类型(基本上是图形节点)的矢量上调用插入函数时出现奇怪的错误。以下是生成赛格故障代码:我仔细检查所有输入std :: vector.insert的Seg错误

69  for (int i = 0; i < size; i++) { 
70   PDTNode * node = arguments[i]->getNode(); 
71   //addChild(node); 
72   children.insert(it, node); // children is vector <PDTNode*> 
73   it++; 
74   node->addParent(this); 
75  } 

,一切都OK,而不是NULL。以下是我为seg故障获得的gdb堆栈跟踪:

#0 0x00007ffff4793202 in ??() from /lib/libc.so.6 
#1 0x00007ffff479163a in memmove() from /lib/libc.so.6 
#2 0x00000000004289f1 in std::__copy_move<false, true, std::random_access_iterator_tag>::__copy_m<PDTNode*> (__first=0x100bd60, __last=0x10053c8, 
__result=0x1001840) at /usr/include/c++/4.4/bits/stl_algobase.h:378 
#3 0x00000000004289ab in std::__copy_move_a<false, PDTNode**, PDTNode**> (__first=0x100bd60, __last=0x10053c8, __result=0x1001840) 
    at /usr/include/c++/4.4/bits/stl_algobase.h:397 
#4 0x0000000000428973 in std::__copy_move_a2<false, PDTNode**, PDTNode**>  (__first=0x100bd60, __last=0x10053c8, __result=0x1001840) 
    at /usr/include/c++/4.4/bits/stl_algobase.h:436 
#5 0x000000000042891d in std::copy<PDTNode**, PDTNode**> (__first=0x100bd60, __last=0x10053c8, __result=0x1001840) 
at /usr/include/c++/4.4/bits/stl_algobase.h:468 
#6 0x00000000004288dc in std::__uninitialized_copy<true>::uninitialized_copy<PDTNode**, PDTNode**> (__first=0x100bd60, __last=0x10053c8, __result=0x1001840) 
    at /usr/include/c++/4.4/bits/stl_uninitialized.h:93 
#7 0x0000000000428847 in std::uninitialized_copy<PDTNode**, PDTNode**> (__first=0x100bd60, __last=0x10053c8, __result=0x1001840) 
    at /usr/include/c++/4.4/bits/stl_uninitialized.h:117 
#8 0x00000000004287b8 in std::__uninitialized_copy_a<PDTNode**, PDTNode**, PDTNode*> (__first=0x100bd60, __last=0x10053c8, __result=0x1001840) 
    at /usr/include/c++/4.4/bits/stl_uninitialized.h:257 
#9 0x0000000000428684 in std::__uninitialized_move_a<PDTNode**, PDTNode**, std::allocator<PDTNode*> > (__first=0x100bd60, __last=0x10053c8, 
    __result=0x1001840, __alloc=...) at /usr/include/c++/4.4/bits/stl_uninitialized.h:267 
#10 0x000000000042812e in std::vector<PDTNode*, std::allocator<PDTNode*> >::_M_insert_aux (this=0x1002810, __position=..., [email protected]) 
    at /usr/include/c++/4.4/bits/vector.tcc:338 
#11 0x000000000043c46d in std::vector<PDTNode*, std::allocator<PDTNode*> >::insert (this=0x1002810, __position=..., [email protected]) 
    at /usr/include/c++/4.4/bits/vector.tcc:126 
#12 0x00000000004d3ea9 in PDTFunctionDec::setArguments (this=0x10027e0, arguments=...) at PDTFunction.cpp:72 

任何帮助都非常感谢。

谢谢

+0

没有足够的代码来表示。我的懒惰方法是在'valgrind'下运行它,它通常很快指出了一些事情。 – smparkes 2012-02-23 21:20:31

回答

7

我估计是一个迭代,但通过插入你触发在所述容器中的元件的重新定位,并因此无效迭代器的元件。这应该是你的分段错误的原因。

4

插入载体可以迭代器失效:

children.insert(it, node); // this can invalidate `it', triggering a 
          // segfault during the next iteration