-1

アプリケーションをデバッグモードで実行すると、次の関数でランタイムエラーが発生することがあります。

void ChatListHandler::seatOccupancyChanged( const std::string& userName, bool occupied, bool isSelf, bool isSelfTable, int tableNo, int seatNo, int numPlayersAtTable )
{
    if(!isSelf && (isInGroup(userName,IN_GAME_GROUP) || isInGroup(userName,IN_LOBBY_GROUP)))
    {
        if(occupied)
        {
            movePlayer(userName,IN_GAME_GROUP);
        }
        else
        {
            movePlayer(userName,IN_LOBBY_GROUP);
        }
    }
}

bool ChatListHandler::isInGroup( const std::string& name, GroupTypeEnum group )
{
    for(size_t i = 0; i < m_groups.size(); ++i)
    {
        if(m_groups[i].second == group)
        {
            if(m_groups[i].first->getList())
            {
                for(agui::ListItem::iterator it = 
                    m_groups[i].first->getList()->getItemsBegin(); it !=
                    m_groups[i].first->getList()->getItemsEnd(); ++it)
                {
                    if((*it).first.text == name)
                    {
                        return true;
                    }
                }
            }

            break;
        }
    }

    return false;

    m_list->repositionGroups();
}

クラッシュします:

if((*it).first.text == name)

私は得る:

Unhandled exception at 0x5fd1942c (msvcp90d.dll) in my.exe: 0xC0000005: Access violation reading location 0x00000040.

呼び出しスタックは次のようになります。 ここに画像の説明を入力してください

ありがとう

4

1 に答える 1

4

すべてのコードを見ないと確信が持てませんが、エラーはこれらの行に関係していると思います。

for(agui::ListItem::iterator it =
                m_groups[i].first->getList()->getItemsBegin(); it !=
                m_groups[i].first->getList()->getItemsEnd(); ++it)

への呼び出しgetList()が毎回まったく同じリストを返す場合(つまり、コピーではなく同じリストへのポインター)でない限り、異なるリストに対してイテレーターを取得する可能性があります。これは、イテレータが異なるリストから取得されるため、チェックit != m_groups[i].first->getList()->getItemsEnd()が常に行われることを意味します。falseその場合、イテレータがリストの最後から外れる可能性があるため、間接参照によってクラッシュが発生します。

お役に立てれば!

于 2012-06-02T22:05:16.917 に答える