2013-08-22 154 views
0

我有一类玩家是这样的:访问冲突读取位置0x00000004

class Player 
{ 
    public: 
    Player(); 
    ~Player(void); 
    Sprite *sprite; 
    Sprite *rocket; 

    void draw(int x, int y, SpaceInvaders *system); 
} 

和Player.cpp

void Player::draw(int x, int y, SpaceInvaders *system) { 

    sprite = system->createSprite("data/player.bmp"); 
    sprite->draw(x, y); 

} 

Player::~Player(void) 
{ 
    sprite->destroy(); 
    rocket->destroy(); 
} 

这场平局方法被称为在一个while循环主:

player.draw(int(xPos), 480-32, system); 

游戏运行良好,直到IX窗口。这就是当我在Player :: draw方法的第一行得到“访问冲突读取位置0x00000004”时。 我读过它可能是由于传递空指针或空引用,但我不知道如何解决这个问题。

希望得到任何帮助,谢谢!

+3

你关注了[三条规则](http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three)? – jrok

+0

“X”窗口?关闭窗口?它是否在Windowed环境中运行( Win32,QT,Gtk)还是作为控制台应用程序? – Chad

+0

“Player :: Player()”的定义是什么? – cdhowie

回答

0

这很可能是因为当关闭窗口时,在调用draw时某些东西被破坏 - 最可能是系统指针。

在你的情况下,当用户想要关闭它的窗口时不应该调用draw(除非x调用另一个函数来启动某种关闭过程)。最好的方法是首先验证系统不是NULL甚至更好,使用共享指针以确保它在使用时仍然有效。之后,你应该确保当窗口关闭时不会调用draw - 当调用draw函数时(或者以上取决于你设计你的应用程序的方式),应该完成绘制。

在旁注中,除非你有一个缓存机制(甚至这不是最好的方式),你每次创建时都会重新创建一个精灵,我建议你保留一个成员变量并初始化构造器中的精灵