当到达insert语句时,下面的代码会给出一个segfault:
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()返回。
快把我逼疯了。我真的不明白为什么会有一个段错误。代码的一个稍有不同的版本,其中in没有声明新的迭代器,而只是将strand1.getStrand().end(); (和另外两个)传递给vector::insert(),它直接抛出了一个没有任何意义的length_error,因为我的向量很小(~10个元素)。
有人能看到我做错了什么吗?
发布于 2011-01-30 02:41:16
如果getStrand()通过值返回vector,那么sit2和eit2就是vector的不同副本的迭代器,一旦获得迭代器,这两个副本就会被销毁。您需要通过引用返回vector,或者保存vector的副本并从该副本获取迭代器。
发布于 2011-01-30 02:42:59
我的猜测是,getStrand返回的是向量的副本,而不是对它的引用。这将导致您正在使用的迭代器(eit、sit2等)在创建后立即失效!
你能粘贴你对这个方法的声明吗?
https://stackoverflow.com/questions/4838700
复制相似问题