1

私はこのような地図を使用しています:

map<int,CUser*> m_mUsers;

..。

for ( i = m_mUsers.begin(); i != m_mUsers.end(); i++ )
{
    if( (*i).second->GetUserID() == pUser->GetUserID() )
        (*i).second->OnDeviceLogout( pUser );
}

..。

マップに追加:

m_mUsers[ sd ] = pUser;

マップからの削除:

i = m_mUsers.find( sd );
m_mUsers.erase( i );

これを実行すると、ほとんどの場合、期待どおりに機能します。しかし、ごくまれに、ジャンクレコードがマップに残ることがあるため、空のマップであると予想されるものを反復処理しようとすると、ジャンクレコードが発生し、i-> second-> GetUserID()...でクラッシュします。私は間違っていますか?

4

1 に答える 1

0

をチェックしていませんi != m_mUsers.end()。あなたのケースに存在することが保証されていない限り、それは正しくありませんsd

i = m_mUsers.find( sd );

//You should do the check before erasing
if (i != m_mUsers.end()) {
    m_mUsers.erase( i );
}

これにより、コードが正しく機能するはずです。ちなみに、 地図の にはstd::shared_ptrまたはstd::unique_ptrを使用することをお勧めします。mapped_typeC++11 を利用できない場合は、スマート ポインターを含むテクニカル レポートまたはブースト ライブラリを試すことができます。参照が必要で、 でCUsers をstd::map管理する必要がない場合は、これを行うこともできます。これは、CUsers のメモリを管理していないことを意味します (c++11 のみ)。

//No room for the question: Who is managing CUser memory in this map?
std::map<int, std::reference_wrapper<CUser>> m_mUsers;

ユーザーを変更しない場合は、次のこともできます。

//Note I added const to CUser
std::map<int, std::reference_wrapper<CUser const>> m_mUsers;
于 2013-03-28T06:11:27.890 に答える