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

时间:2015-02-05 13:41:04

标签: c++ virtual access-violation

每当我在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;
}

4 个答案:

答案 0 :(得分:2)

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

但是,虚拟功能不需要vptr。此外,编译器能够在编译时确定函数。我怀疑在您致电isFinished时,您会发现this指针是null或某个垃圾值。

如果您发布整个main,我们可以准确找出问题的确切位置。

答案 1 :(得分:0)

可能currentScreen不是你所期望的那样 - 但很难用那段代码来判断。

答案 2 :(得分:-1)

我认为问题在于以下几行:

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

1)让guiElement == NULL - >是真的 2)guiElement->任何失败,因为guiElement IS NULL ...

答案 3 :(得分:-1)

自己找到答案。意外删除了guiElement。