调用虚拟方法时出现 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。
每当我在 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。