вектор c ++: сегментация при вставке - PullRequest
1 голос
/ 29 января 2011

Следующий код выдает ошибку при достижении оператора вставки:

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 ().

Это сводит меня с ума.Я действительно не могу понять, почему есть Segfault.Немного другая версия кода, в которой in не объявлял новые итераторы, а просто передавал strand1.getStrand().end(); (и два других) в vector :: insert (), и он бросил length_error, что также не имеет никакого смысла, так какмои векторы малы (~ 10 элементов).

Кто-нибудь может увидеть, что я здесь не так делаю? `

Ответы [ 2 ]

4 голосов
/ 29 января 2011

Если getStrand() возвращает vector по значению , то sit2 и eit2 являются итераторами в разные копии vector, и обе копии уничтожаются, как только вы получаетеитераторы.Вам нужно либо вернуть vector по ссылке , либо сохранить копию vector и получить вместо этого итераторы из этой одной копии.

2 голосов
/ 29 января 2011

Я предполагаю, что getStrand возвращает копию вектора, а не ссылку на него. Это приведет к тому, что используемые итераторы (eit, sit2 и т. Д.) Станут недействительными сразу после их создания!

Можете ли вы вставить свою декларацию для этого метода?

...