c++ - 关闭时出现访问冲突错误

标签 c++ access-violation

所以我有 3 个类(class)。一个主类 ClassA、一个基类 ClassB 和一个继承类 ClassC 一起工作,但是,当我关闭我的程序时,出现“访问冲突写入位置”错误。

这是设置:

A类.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_;
};

A 类.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 类

C类.h

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

private:
    int posx_;
    int posy_;
}

C 类.cpp

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

我觉得我在某处有一个引用错误,但我不知道在哪里。该问题仅在生成子弹时出现,因此如果我在整个程序中不按空格键然后关闭它,程序将正常退出。但是,如果我在运行时按下空格键,则会导致访问冲突错误。我已经检查了ClassA的析构函数,但是问题出现在析构函数中是否有东西。

我试图只显示与问题相关的代码。有一个用于初始化 bullet_ 和 player_ 的初始化函数,但看不到它与问题相关。

析构函数:

A级 A 类::~A 类(无效) { 删除播放器_; 删除项目符号_;

B类和C类

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

最佳答案

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

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

此外,请发送您的构造函数、析构函数、对象创建等代码。

关于c++ - 关闭时出现访问冲突错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21637796/

相关文章:

c - 为什么这段修改字符串的代码不起作用?

c++ - 访问冲突(未处理的异常)

c++ - 从基类方法使用派生类数据成员

c++ - Visual C++ 等同于 GCC 实验性并行 for_each?

c - C 中的链表访问冲突

c++ - 由于 ID3D11Buffer 而导致访问冲突

c++ - 内存访问冲突的操作系统处理与内存写入冲突的处理

c++ - 迭代器有效性,在 std::set 中调用 erase() 之后

c++ - CreateProcessWithLogonW : unable to start process

c++ - 在结构中制作某个结构的数组。