c ++ vector:插入时的段错误

时间:2011-01-29 18:38:13

标签: vector insert segmentation-fault

下面的代码在到达insert语句时给出了段错误:

rna* annealer::anneal(rna strand1, rna strand2, const rna & opponent){

 std::vector<nukleotid*>::iterator sit2;
 std::vector<nukleotid*>::iterator eit2;
 std::vector<nukleotid*>::iterator eit;

 if(tryAnneal(strand1, strand2, opponent)) {
  eit = strand1.getStrand().end();
  sit2 = strand2.getStrand().begin();
  eit2 = strand2.getStrand().end();

         //here be segfault
  strand1.getStrand().insert(eit, sit2, eit2);
  strand1.isAnnealed = true;
  rna* str = &strand1;
  std::cout << *str << std::endl;
  return str;
 }


    //...

 return NULL;
}

rna包含一个向量,由getStrand()返回。

它使我疯狂。我真的不明白为什么这是一个段错误。一个稍微不同的代码版本,其中没有声明新的迭代器,但只是传递strand1.getStrand().end();(和另外两个),传递给vector :: insert(),并且完全抛出了一个也没有任何意义的length_error ,因为我的矢量很小(约10个元素)。

谁能看到我在这里做错了什么?`

2 个答案:

答案 0 :(得分:4)

如果getStrand()按值返回vector ,则sit2eit2vector的不同副本的迭代器,一旦获得迭代器,两个副本都会被销毁。您需要通过引用返回vector 或保存vector的副本,并从该副本中获取迭代器。

答案 1 :(得分:2)

我的猜测是getStrand返回了一个向量的副本,而不是对它的引用。这将导致您正在使用的迭代器(eit,sit2等)在创建后立即失效!

您可以粘贴该方法的声明吗?