的答案可以在这里找到:
有效C++摘录,第三版,斯科特·迈尔斯
网址: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发生,删除时会发生内存泄漏。删除指针引用R6025也会在“程序退出”时发生,此时cApplication应用程序将被销毁。
由于嘟嘟声,R6025吓到我了。
似乎我必须在两者之间做出选择,但我只是不想这样做,这里发生了什么?
你好,约翰
编辑:添加了一些代码,看起来Eran是对的,因为我在那里称之为虚拟函数。
编辑:添加到示例中,虚拟空OnLostDevice() = 0;。从抽象到ascoop的转变给出了一个即时的解决方案。开始阅读下面评论中的那一页,因为我觉得我还没有到那里。
编辑:在我得到答案之后,我就明白了自己的问题。所以我重写了这个问题,所以答案符合这个问题。
谢谢,约翰
发布于 2012-06-29 21:22:45
不能在析构函数中调用构造函数和中的虚拟函数。我在这里没有看到一个纯粹的虚拟函数,但是如果cBaseApplication::Release碰巧调用了一个函数,那么每次销毁一个cBaseApplication时都会得到这个错误。我不确定这就是问题所在,因为我没有所有的代码,但是您的代码需要这样的问题。
https://stackoverflow.com/questions/11269035
复制相似问题