ポインタオブジェクトへの文字列とベクトルを含むマップがあります。ベクトルのオブジェクトを削除しようとするとうまくいくように見えますが、別の関数のベクトルオブジェクトをすべてリストアウトすると、削除されたオブジェクトの位置にヒットしたときにプログラムがクラッシュ/アボートします。私はオブジェクトを削除することを台無しにしてしまったと思うし、ポインタが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; }
}
コードはエラーなしで削除されますが、マップ内のすべてのベクトルを表示する別の機能を実行すると、プログラムがクラッシュします。
['std :: vector :: erase'](http://en.cppreference.com/w/cpp/container/vector/erase)について読んでください。特にそれが返すものに細心の注意を払う。それを使用するには、ループのリファクタリングが必要になります。 –
'delete'はポインタが指すメモリだけを削除します。ベクトルには何もしません。 – NathanOliver
であり、ロー・ポインタを非常に過渡的な操作以外のベクトルに格納しません。 –