2011-01-29 11 views
1

INSERTステートメントに到達したときfolowingコードは、セグメンテーション違反を与えている:C++ベクター:インサートにセグメンテーション違反

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をtheresなぜ理解することはできません。新しい反復子を宣言していないが、strand1.getStrand().end();(と2つの他のもの)をvector :: insert()に渡していたコードのわずかに異なるバージョンは、私のベクトルとしても意味をなさないlength_errorを投げた小さい(〜10要素)。

誰もが私がここで間違ってやっているかを見ることができますか? `

答えて

4

getStrand()値によってvectorを返す場合、sit2eit2vectorの異なるコピーへのイテレータがあり、両方のコピーは、できるだけ早くに破壊されていますイテレータを取得します。 vectorを参照番号で返すか、vectorのコピーを保存して、代わりにそのコピーからイテレータを取得する必要があります。

2

私の推測では、getStrandはベクトルへの参照ではなくベクトルのコピーを返しています。これは、使用しているイテレータ(eit、sit2など)が作成された直後に無効になる原因になります。

その方法の宣言を貼り付けることはできますか?

+0

はい、そうです。私のベクトルは価値によって返されます!どうもありがとうございました! – TeaOverflow

関連する問題