访问冲突:0xC0000005,为什么会发生这种情况?

时间:2015-06-10 11:16:01

标签: c++ object memory call access-violation

目前在我的游戏服务器上工作。当玩家在尸体对象的矩形上方发送消息以使用特定项目时,会发生此异常。

此代码发生在名为“匹配”的对象中,该对象包含玩家和尸体的完整列表。

一分钟我的对象很好,我可以读取它的所有变量值,没有垃圾值。然后突然之间,我无法读取我所在物体中的任何记忆。无缘无故。这最终会导致访问冲突异常。

当玩家发送使用项目消息时,此功能被称为:

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);
}

1 个答案:

答案 0 :(得分:0)

当我第一次创建我的Corpse对象并将其推送到列表中时,我实际上并没有设置c-&gt; thisPlayer,因此它有一个垃圾值。