ポインターのマップがあります。エントリを探して、ポインタのローカル コピーを作成し、マップ内のエントリを削除します。私の質問は、エントリが見つからなかった場合に備えて、このコードが問題を引き起こす可能性はありますか?
std::map<int, object*>::iterator it2 = m_Frames.find(m_num);
m_objpointer = it2->second;
m_Frames.erase (it2);
エントリがないとマップの最後が返ってきます!したがって、未定義の動作になります。これを行う方が良い:
if((it2 = m_Frames.find(m_num))!=m_Frames.end())
{
m_objpointer = it2->second;
m_Frames.erase (it2);
}
「このコードは問題を引き起こす可能性がありますか?」
はい。この場合、終了std::map::find
要素が返される可能性があります。つまり、無効なメモリにアクセスしようとすると、未定義の動作が発生します。m_Frames.end()
要素が見つかったかどうかを確認し、見つからない場合は、そのようなシナリオを明示的に処理する必要があります。
if (it2 != m_Frames.end()) {
m_objpointer = it2->second;
m_Frames.erase(it2);
}
else {
// TODO: element not found
}