调用虚拟方法时出现 C++ 访问冲突

C++ access violation when calling virtual method

每当我在 GUIElement 对象中调用虚拟方法时,我都会收到访问冲突异常。但是,调用"isFinished()"时也不例外。

我正在使用 Visual Studio 2013.

这是我的代码:

main.cpp的一些代码:

GUIElement* guiElement = NULL;

void init()
{ 
     guiElement = new GUIElement(&b);
}

void draw()
{

     if (guiElement == NULL || !(guiElement->hidesScreen())) //Causes the exception
        currentScreen->draw();
}

GUIElement.h

#pragma once
class GUIElement
{
public:
    GUIElement(bool* ok);
    ~GUIElement();
    bool isFinished();
    virtual void update(float deltaMs);
    virtual void draw();
    virtual bool pausesScreen();
    virtual bool hidesScreen();
private:
    bool finished;
protected:
    virtual void onFinish();
    bool* ok;
};

GUIElement.cpp

#include "GUIElement.h"


GUIElement::GUIElement(bool* ok)
{
    this->ok = ok;
}


GUIElement::~GUIElement()
{
}

bool GUIElement::isFinished()
{
    return finished;
}

void GUIElement::onFinish()
{
    finished = true;
}

void GUIElement::update(float deltaMs)
{

}

void GUIElement::draw()
{

}

bool GUIElement::pausesScreen()
{
    return false;
}

bool GUIElement::hidesScreen()
{
    return false;
}

您遇到的问题通常发生在您通过无效指针调用方法时。虚拟方法需要 v-table 才能进行调用,并且虚拟 table 指针(通常缩写为 vptr)存储在您的实例中。因此,您必须指向一个有效的实例,以便调用不会表现出未定义的行为(在您的情况下是崩溃!)。

但是,并非虚函数不需要vptr。此外,编译器能够在编译时确定函数。我怀疑在您对 isFinished 的调用中,您会看到 this 指针是 null 或一些垃圾值。

如果您 post 整个 main 我们或许可以准确地找出问题所在。

我认为问题出在以下行:

if (guiElement == NULL || !(guiElement->hidesScreen()))    

1) 让 guiElement == NULL -> 为 True
2) guiElement->anything 失败,因为 guiElement 为 NULL...

可能 currentScreen 不是您期望的那样 — 但很难用 一段代码来判断。

自己找到了答案。不小心删除了guiElement。