0

ポインターのマップがあります。エントリを探して、ポインタのローカル コピーを作成し、マップ内のエントリを削除します。私の質問は、エントリが見つからなかった場合に備えて、このコードが問題を引き起こす可能性はありますか?

std::map<int, object*>::iterator it2 = m_Frames.find(m_num);
m_objpointer = it2->second;
m_Frames.erase (it2);
4

6 に答える 6

2

エントリがないとマップの最後が返ってきます!したがって、未定義の動作になります。これを行う方が良い:

if((it2 = m_Frames.find(m_num))!=m_Frames.end())
{
  m_objpointer = it2->second;
  m_Frames.erase (it2);

}
于 2013-10-17T09:10:31.937 に答える
1

「このコードは問題を引き起こす可能性がありますか?」

はい。この場合、終了std::map::find要素が返される可能性があります。つまり、無効なメモリにアクセスしようとすると、未定義の動作が発生します。m_Frames.end()

要素が見つかったかどうかを確認し、見つからない場合は、そのようなシナリオを明示的に処理する必要があります。

if (it2 != m_Frames.end()) {
    m_objpointer = it2->second;
    m_Frames.erase(it2);
}
else {
    // TODO: element not found
}
于 2013-10-17T09:10:35.437 に答える