C++ 列表中指针的问题
出于某种原因,当我尝试读取C++ 列表中指针的问题,c++,pointers,stl,winsock,C++,Pointers,Stl,Winsock,出于某种原因,当我尝试读取std::list(playerlist)中指向对象(GamePlayer)的指针的属性时,它一开始会工作,但当我稍后尝试在另一个函数中访问它时,我会得到一堆随机数,而不是客户端套接字的数字。那是一口,对不起。我希望有人能解释一下情况。我将包括缺陷代码的简化版本 class GameRoom { list<GamePlayer*> playerlist; locigPort( LogicObj ); } bool GameRoom::
std::list
(playerlist
)中指向对象(GamePlayer
)的指针的属性时,它一开始会工作,但当我稍后尝试在另一个函数中访问它时,我会得到一堆随机数,而不是客户端套接字的数字。那是一口,对不起。我希望有人能解释一下情况。我将包括缺陷代码的简化版本
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;
}
class游戏室{
列表玩家列表;
本地端口(LogicObj);
}
bool GameRoom::logicPort(LogicObj logit){//这是房间[1]
列表::迭代器;
for(it=playerlist.begin();it!=playerlist.end();it++){
cout最可能的解释是,您正在使用一个指针调用addPlayer
,而当您调用logicPort
时,该指针将变得无效。一种可能是,您使用堆栈上对象的地址调用addPlayer
,当堆栈解卷时,该对象将消失
编辑问题就在这里:
bool PlayerDB::addPlayer( int sid, GamePlayer tempplayer ) {
...
roomman.addPlayer( &tempplayer, tempplayer.roomno );
}
PlayerDB::addPlayer
按值获取第二个参数。这意味着它获取一个在方法生命周期内存在的副本。然后获取指向该副本的指针,并将其添加到列表中。一旦PlayerDB::addPlayer
返回,指针将无效
在没有看到更多代码的情况下,很难提出一个好的修复方案。一种可能是让PlayerDB::addPlayer
将指针作为其第二个参数,并确保在调用链的上一级不会重复同样的错误
更好的方法是将playerlist
转换为list
:从您的代码中,列表似乎不需要包含指针。这将大大简化事情。最有可能的解释是,您正在使用指针调用addPlayer
,而当您调用时,指针将无效de>logicPort
。一种可能是您使用堆栈上对象的地址调用addPlayer
,当堆栈展开时,对象消失
编辑问题就在这里:
bool PlayerDB::addPlayer( int sid, GamePlayer tempplayer ) {
...
roomman.addPlayer( &tempplayer, tempplayer.roomno );
}
PlayerDB::addPlayer
按值获取第二个参数。这意味着它获取一个在方法生命周期内存在的副本。然后获取指向该副本的指针,并将其添加到列表中。一旦PlayerDB::addPlayer
返回,指针将无效
在没有看到更多代码的情况下,很难提出一个好的修复方案。一种可能是让PlayerDB::addPlayer
将指针作为其第二个参数,并确保在调用链的上一级不会重复同样的错误
一个更好的可能性是将
播放列表
转换为列表
:从代码中看,列表似乎不需要包含指针。这将大大简化事情。检查介于良好读取和错误读取之间的套接字会发生什么情况。如果可以取消指针引用,则可能会发生错误列表几乎没有问题。@Roland:这种错误可以通过诊断。检查在正确读取和错误读取之间的套接字发生了什么。如果可以取消引用指针,列表可能没有问题。@Roland:这种错误可以通过.templayer.socketno=sid;诊断。//添加播放r到房间roomman.addPlayer(&templayer,templayer.roomno);@RolandSams:还需要更多的上下文。什么是堆栈上的对象templayer
?对不起,我是新成员,你能告诉我如何在回复中格式化代码吗?@RolandSams:你可以使用反勾(`
)对于短代码段。长代码段最好作为问题的一部分发布(您可以编辑),而不是作为注释发布。boolplayerdb::addPlayer(int-sid,GamePlayer-templayer){templayer.socketno=sid;PlayerDBint[sid]=templayer;//将玩家添加到roomman.addPlayer(&templayer,templayer.roomno);cout templayer.socketno=sid;//将播放器添加到房间roomman.addPlayer(&templayer,templayer.roomno);@RolandSams:还需要更多的上下文。什么是堆栈上的对象templayer
?对不起,我是新成员。你能告诉我如何在回复中格式化代码吗?@RolandSams:你可以使用backticks(`
)对于短代码段。长代码段最好作为问题的一部分发布(您可以编辑),而不是作为注释发布。boolplayerdb::addPlayer(int-sid,GamePlayer-templayer){templayer.socketno=sid;PlayerDBint[sid]=templayer;//将玩家添加到房间roomman.addPlayer(&templayer,templayer.roomno);cout