gpt4 book ai didi

c++ - std::vector push_back() 使程序崩溃

转载 作者:行者123 更新时间:2023-11-28 07:31:55 26 4
gpt4 key购买 nike

我有一个功能可以检查其他玩家在 map 上的移动并相应地调整他们的位置,它还会检查玩家是否刚刚进入。

void mapManager::checkForOtherPlayerMovement(int plyId)
{
sf::Packet receivedPacket;
std::vector<player>::iterator it;
player pl(0,0,1);

if(socket->Receive(receivedPacket) == sf::Socket::Done)
{
int header;
receivedPacket >> header;

switch(header)
{
case PACKET_PLAYER_DISPATCHNEWPOSITION:
{
receivedPacket >> pl;

std::cout << pl.plyId << std::endl;

if(plyId != pl.plyId)
{
try
{
if(pl.plyId != 0)
{
std::cout << "DEBUG1" << std::endl;
players->at(pl.plyId-1).posX = pl.posX;
players->at(pl.plyId-1).posY = pl.posY;
}
else
{
std::cout << "DEBUG2" << std::endl;
players->at(pl.plyId).posX = pl.posX;
players->at(pl.plyId).posY = pl.posY;
}


}
catch(const std::out_of_range& oor)
{
std::cout << "Added new player!" << std::endl;
players->push_back(pl); // This crashes

}
}


break;

}
case PACKET_PLAYER_DISPATCHENTEREDMAP:
{
break;
}


}
}





}

所以基本上崩溃发生在新玩家连接到服务器并且游戏需要将其添加到 vector 中时。奇怪的是,它在 visual studio 2010 上没有崩溃,但是当我切换到 vs 2012 时崩溃,所以我一定是做错了什么。

编辑:这是玩家 vector 的创建方式

map 管理器.h

std::vector<player> * players;

map 管理器.cpp

players = new std::vector<player>();

这里我使用玩家 vector

void mapManager::drawOtherPlayers(int plyId, player *ownPlayer)
{
ownPlayerSprite->SetPosition(ownPlayer->getX(), ownPlayer->getY());
window.Draw(*ownPlayerSprite);

for(std::vector<player>::iterator it = players->begin(); it != players->end(); ++it)
{
spriteToDraw->SetPosition(it->posX,it->posY);
window.Draw(*spriteToDraw);
}

}

我的播放器类别:Player.h and player.cpp

最佳答案

您提供的代码似乎没有任何问题。

虽然您正在使用的 try-catch 构造可能不是我会做的事情,但据我所知,它没有任何问题。 C++03 和 C++11 标准都保证如果元素不存在,at抛出 std::out_of_range

您需要到别处寻找错误。引起我兴趣的一件事是您正在动态分配 vector。没有提出对此的推理,但由于您使用 vector 的方式似乎没有任何问题假设它存在,可能的情况是vector 已损坏、已被删除,或者您的动态内存管理有其他问题。如果不使用动态分配也能过得去,我强烈推荐它。如果你不能没有动态分配,那么至少使用智能指针而不是原始指针。

另一个值得关注的地方是player 的构造函数,尤其是复制构造函数。由于 push_back 将创建所添加元素的拷贝,如果 vector 本身没有问题,则问题可能出在复制构造函数中。

player写一个拷贝构造函数,像这样:

player (const player& rhs)
:
posX (rhs.posX),
mapId (rhs.mapId),
plyId (rhs.plyId),
playerModel (rhs.playerModel)
{
}

在初始化列表的第一行设置断点。它击中了吗?进入每个成员的构造函数。他们会崩溃吗?

关于c++ - std::vector push_back() 使程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17489454/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com