2012-06-02 131 views
-1

當我運行我在調試模式下的應用,有時我得到一個運行時錯誤在此函數:爲什麼std string ==崩潰?

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. 

的調用堆棧看起來像: ​​

感謝

+5

發佈一個真正的堆棧跟蹤,請... –

回答

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,因爲迭代器來自不同的列表。在那種情況下,你的迭代器可能會走到列表的末尾,所以解引用會導致崩潰。

希望這會有所幫助!