Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 列表中指针的问题_C++_Pointers_Stl_Winsock - Fatal编程技术网

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