关闭时访问冲突错误

时间:2014-02-07 21:09:00

标签: c++ access-violation

所以我有3节课。一个主要的类,ClassA,一个基类,ClassB和一个继承的类,ClassC,然而,当我关闭我的程序时,我得到一个“访问冲突写入位置”错误。

以下是设置:

ClassA .h

ClassA
{
public:
    ClassA(void) : player_(NULL), bullet_(NULL) {};
    ~ClassA(void);

    void Update();
    void fireBullet(int posx, int posy, int speed);

private:
    ClassB* player_;
    ClassB* bullet_;
};

ClassA .cpp

void ClassA::Update()
{
    ClassA* pointer = this;
    player_->Update(*pointer);

    if(bullet_->IsAlive())
        bullet_->Update(*pointer);
}

void fireBullet(int posx, int posy, int speed)
{
    //make it active, set its position and speed
}

B类只是基类,因此我只发布C类

ClassC .h

ClassC : public ClassB
{
public:
    ClassC() : posx_(0), posy_(0) {};
    virtual void Update(ClassA &a);

private:
    int posx_;
    int posy_;
}

ClassC .cpp

void ClassC::Update(ClassA &a)
{
    if(spacebar == pressed)
        a.fireBullet(posx_, posy_, 10);
}

我觉得我在某处有引用错误,但我不知道在哪里。问题只发生在子弹产生时,如果我不在整个程序中按空格键然后关闭它,程序将正常退出。但是,如果我在运行时按空格键,则会导致访问冲突错误。我检查了ClassA析构函数,但是在析构函数中是否存在某些问题时会出现问题。

我试图只显示问题的相关代码。有一个初始化函数可以初始化bullet_和player_但是没有看到它与问题相关。

析构函数:

ClassA的     ClassA的::〜ClassA的(无效)     {         删除player_;         删除bullets_;     }

ClassB和ClassC

~Class {};

另外,player_和bullet_在ClassA的函数中初始化:

ClassA::Initialise()
{
    ClassB* player = new ClassC;
    player->Initialise();
    player_ = player;

    ClassB* bullet = new ClassD; //ClassD is also inherited from B
    bullet->Initialise();
    bullet_ = bullet;
}

2 个答案:

答案 0 :(得分:0)

我可以注意到的一个错误是您在ClassC :: Update(ClassA& a)中通过引用发送ClassA,然后在此之后将其用作指针。 试着写

void ClassC::Update(ClassA &a)
{
    if(spacebar == pressed)
        a.fireBullet(posx_, posy_, 10);
}

另外,请发送构造函数,析构函数,对象创建等代码。

答案 1 :(得分:0)

因为您的程序在结束后获得访问冲突。这意味着错误在析构函数中。有时在没有显式调用的情况下调用析构函数。但是你在发布的文件中,现在有这样的隐藏调用。这意味着错误在你的析构函数中。

ClassA ClassA:: ~ClassA(void)
{
    delete player_;
    delete bullets_;
}

所以这段代码会导致问题。因为如果指针是nullptrs或只是一些垃圾,将会有访问冲突。为了避免它,我建议检查它们。

ClassA ClassA:: ~ClassA(void)
{
    if ( player_ )
    {    
        delete player_;
        player_ = nullptr; // or NULL if it's not c++0x
    }
    if ( bullets_ )
    {
        delete bullets_;
        bullets_ = nullptr;
    }
} 

但为了使这段代码真正得到保护,你必须要这样做 1.在构造函数中将它们设置为nullptr 2.在callin delete之后将它们设置为nullptr。

就是这样。如果有帮助,请回信。

MarkGrin