列表中的指针问题

时间:2011-10-18 07:03:30

标签: c++ pointers stl winsock

出于某种原因,当我尝试在GamePlayerstd::list)内读取指向对象(playerlist)的指针的属性时,它首先起作用,但是当我尝试稍后在另一个函数中访问它我得到一堆随机数而不是我客户端套接字的数字。那是满口的,抱歉。我希望有人能够对这种情况有所了解。我将包含有缺陷代码的简化版本。

class GameRoom  {

    list<GamePlayer*> playerlist;
    locigPort( LogicObj );
}


bool GameRoom::logicPort( LogicObj logit )  {   // This is room[1]

    list<GamePlayer*>::iterator it;

        for (it = playerlist.begin(); it != playerlist.end(); it++){  

                cout << "socket numbers " << (*it)->socketno << endl;  
                /* (*it)->socketno gives me a bunch of random numbers, 
                   not the socket numbers I was looking for! */
        }  

    return true;

}

bool RoomDB::addPlayer( GamePlayer *playerpoint )   {

    roomlist[1].playerlist.push_back( playerpoint );    
    // This adds the player object to the Gameroom object

    cout << "player point " << playerpoint->socketno << " roomno: " << roomno;  
    // This shows everything should be ok so far

    return true;
}

1 个答案:

答案 0 :(得分:1)

最可能的解释是,当您拨打addPlayer时,您使用指针调用logicPort而不是无效。一种可能性是使用堆栈中对象的地址调用addPlayer,并且当堆栈展开时对象消失。

编辑问题就在这里:

bool PlayerDB::addPlayer( int sid, GamePlayer tempplayer ) {
   ...
   roomman.addPlayer( &tempplayer, tempplayer.roomno );
}

PlayerDB::addPlayer按值获取第二个参数。这意味着它获得了该方法生命周期中存在的副本。然后,您将指针指向该副本,并将其添加到列表中。一旦PlayerDB::addPlayer返回,指针就会变为无效。

如果没有看到更多代码,很难建议一个好的解决方案。一种可能性是使PlayerDB::addPlayer将指针作为其第二个参数,并确保不要在调用链的一个层次上重复相同的错误

更好的可能性是将playerlist变为list<GamePlayer>:从您的代码中,似乎不需要列表包含指针。这将大大简化事情。