下面的代码在到达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个元素)。
谁能看到我在这里做错了什么?`
答案 0 :(得分:4)
如果getStrand()
按值返回vector
,则sit2
和eit2
是vector
的不同副本的迭代器,一旦获得迭代器,两个副本都会被销毁。您需要通过引用返回vector
或保存vector
的副本,并从该副本中获取迭代器。
答案 1 :(得分:2)
我的猜测是getStrand返回了一个向量的副本,而不是对它的引用。这将导致您正在使用的迭代器(eit,sit2等)在创建后立即失效!
您可以粘贴该方法的声明吗?