目前在我的游戏服务器上工作。当玩家在尸体对象的矩形上方发送消息以使用特定项目时,会发生此异常。
此代码发生在名为“匹配”的对象中,该对象包含玩家和尸体的完整列表。
一分钟我的对象很好,我可以读取它的所有变量值,没有垃圾值。然后突然之间,我无法读取我所在物体中的任何记忆。无缘无故。这最终会导致访问冲突异常。
当玩家发送使用项目消息时,此功能被称为:
void Player::use_res(){
myMatch->res_corpse_under_player(this);
}
我给我想要的玩家检查它是否在Match对象中的这个函数的尸体上。所以现在我们在匹配对象中。以下是此事件发生的三个函数,它们位于 Match.cpp 中:
bool intersect_inmatch(SFRECTANGLE a, SFRECTANGLE b){
if (a.left < b.right && b.left < a.right && a.top < b.bottom)
return b.top < a.bottom;
else
return false;
}
//Find the corpse that's undernearth this player
//corpse loop exception fix attempt
Corpse* Match::find_corpse_under_player(Player* player){
bool intersection = false;
SFRECTANGLE prect = player->getPRECT();
std::list<Corpse>::iterator cit;
cit = corpses.begin();
while(cit != corpses.end()){
SFRECTANGLE crect;
crect.left = cit->x;
crect.top = cit->y;
crect.right = cit->x + cit->mask.getSize().x;
crect.bottom = cit->y + cit->mask.getSize().y;
intersection = intersect_inmatch(prect, crect);
if(intersection){
return &(*cit);
}
++cit;
}
return NULL;
}
void Match::res_corpse_under_player(Player* player){
cout << "res corpse match function call" << endl;
Corpse* c = find_corpse_under_player(player);
if(c != NULL){
cout << "found corpse" << endl;
cout << "corpse name: " << c->name << endl;
if(c->thisPlayer != NULL){
cout << "this player: " << c->thisPlayer->name << endl;
}
}
}
我调试了它,对象似乎无法在此行之后访问自身的任何内存:
intersection = intersect_inmatch(prect,crect);
此功能是我尝试查看矩形是否重叠的地方。 这是调试的图片: http://i.imgur.com/M4yphMO.png
我尝试进入intersect_inmatch(...)调用但由于某种原因调试器指向这一行:
crect.bottom = cit-&gt; y + cit-&gt; mask.getSize()。y;
然后它又回到了这一行:
intersection = intersect_inmatch(prect,crect);
我尝试再次踏入它,但现在它已经过去了。之后,对象似乎无法读取任何内存(图中的步骤3)。我不知道为什么会这样。什么可能这样做?我已经花了6个小时试图找出原因,但我找不到原因。
此行发生异常:
cout&lt;&lt; “这个玩家:”&lt;&lt; c-&gt; thisPlayer-&gt; name&lt;&lt; ENDL;
Server.exe中0x696C40F6(msvcp110.dll)的未处理异常:0xC0000005:访问冲突读取位置0x00000000。
修改 这是我最初创建corpse对象并将其推送到Match对象中的列表的位置:
//Player.cpp
Player::make_corpse_out_of_this_player(){
Corpse corpse(x, y, this); //this == instance of Player, setting Player* thisPlayer pointer to this in Corpse object.
corpse.name = string(name);
corpse.mask = mask;
myMatchPointer->corpses.push_back(corpse);
}
答案 0 :(得分:0)
当我第一次创建我的Corpse对象并将其推送到列表中时,我实际上并没有设置c-&gt; thisPlayer,因此它有一个垃圾值。