可在此处找到答案:
发布的An Excerpt from Effective C++, Third Edition, by Scott Meyers
网址:hmjd
请阅读该页面,以便了解其发生的原因。也知道为什么要替换
virtual void OnRelease() = 0;
由:
virtual void OnRelease(){};
会起作用但不是正确的解决方法。
原始问题
R6025:纯虚函数调用
#include <Windows.h>
// static lib
//file.h
class cBaseApplication
{
public:
virtual ~cBaseApplication(){ Release(); }
virtual void Release()
{
OnRelease();
};
virtual void OnRelease() = 0;
}; // class cBaseApplication
//file1.h
class cApplication : public cBaseApplication
{
public:
virtual void OnRelease()
{
/* what the heck do something here */
};
}; // class cApplication
// executable
// file3.h
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow )
{
cApplication* pApplication = new cApplication();
/*...what the heck, do stuff...*/
pApplication->Release();
delete pApplication; // R6025: pure virtual function call
pApplication = NULL;
return 0;
}
在
行delete pApplication;
发生R6025,并且在移除时,会发生所有精细但内存泄漏。 当cApplication应用程序将被破坏时,在“程序退出”时也会删除指针引用R6025。
由于哔哔声,R6025让我害怕:s
因为看起来我必须在两者之间做出选择,但我只是不想,这里发生了什么?
此致 约翰
编辑:添加了一些代码,似乎Eran是正确的,因为我在那里调用虚函数编辑:添加到示例,[virtual void OnLostDevice()= 0; ]。从抽象变为ascoop提供了一个直接的解决方案。开始在下面的评论中阅读该页面,因为我感觉我还没有。
编辑:得到答案后我理解了自己的问题。所以我重写了这个问题,所以答案符合这个问题。谢谢,约翰
答案 0 :(得分:7)
您不能在析构函数中的构造函数和中调用虚函数。我在这里看不到纯虚函数,但是如果cBaseApplication::Release
碰巧调用了一个,那么每次你破坏cBaseApplication
时都会得到错误。我不确定这是什么问题,因为我没有所有代码,但是你的代码要求解决这类问题。