2016-12-13 5 views
-1

ポインタオブジェクトへの文字列とベクトルを含むマップがあります。ベクトルのオブジェクトを削除しようとするとうまくいくように見えますが、別の関数のベクトルオブジェクトをすべてリストアウトすると、削除されたオブジェクトの位置にヒットしたときにプログラムがクラッシュ/アボートします。私はオブジェクトを削除することを台無しにしてしまったと思うし、ポインタがNULLを指している、なぜこれが起こっているのですが、私はこの時点では本当に分かりません。マップ内のベクトルポインタオブジェクト要素の削除

//map is: map<string, vector<baseObject *>> 

vector<Message*>::iterator v_itr; 
vector<baseObject*> & vec = itr->second; 
    for (v_itr = vec.begin(); v_itr != vec.end(); v_itr++){ 

    firstDerivedObj * p_first = dynamic_cast<TextMessage*>(*v_itr); 
    secondDerivedObj * p_second = dynamic_cast<VoiceMessage*>(*v_itr); 

    if (p_first){ 
     delete p_first; 
    } 
    if (p_second){ delete p_second; } 
} 

コードはエラーなしで削除されますが、マップ内のすべてのベクトルを表示する別の機能を実行すると、プログラムがクラッシュします。

+1

['std :: vector :: erase'](http://en.cppreference.com/w/cpp/container/vector/erase)について読んでください。特にそれが返すものに細心の注意を払う。それを使用するには、ループのリファクタリングが必要になります。 –

+0

'delete'はポインタが指すメモリだけを削除します。ベクトルには何もしません。 – NathanOliver

+1

であり、ロー・ポインタを非常に過渡的な操作以外のベクトルに格納しません。 –

答えて

0

特定のベクトル要素が指すメモリからオブジェクトを削除すると、その要素はそのメモリ位置を指しているため、エラーが発生しています。私はベクトルからその場所を消去する必要があることをお勧めします。このようなものがうまくいくはずです。

vector<Message*>::iterator v_itr; 
vector<baseObject*> & vec = itr->second; 
for (v_itr = vec.begin(); v_itr != vec.end(); v_itr++){  
    firstDerivedObj * p_first = dynamic_cast<TextMessage*>(*v_itr); 
    secondDerivedObj * p_second = dynamic_cast<VoiceMessage*>(*v_itr); 
    if(p_first || p_second){ 
     if (p_first){ 
      delete p_first; 
     } 
     if (p_second){ 
      delete p_second; 
     } 
     vec.erase(v_itr); 
     break; 
    } 
} 
+0

うわーありがとうございます。私はその消し声明があったので、それは壊れていないので、それを介して迷惑スーパー。ブレークがなければ、関数は異常終了/クラッシュします。なぜ休憩が必要ですか?他のif文では使用せず、エラーなく終了します。ループを短くするには – user2093601

+0

。 Eraseは、イテレータを次の要素に変更し、ループが不正になります。 – tinstaafl

関連する問題