【发布时间】:2012-07-01 09:54:46
【问题描述】:
可以在这里找到答案:
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; ]。从abstract 到ascoop 的改变给出了一个直接的解决方案。开始在下面的 cmets 中阅读该页面,因为我觉得我还没有到那里。
编辑:得到答案后,我明白了自己的问题。所以我重写了问题,所以答案符合问题。
谢谢,约翰
【问题讨论】:
-
R6025:纯虚函数调用——弹出消息框
-
@thb 这是一个由 MSVC 程序打印的runtime error。
-
上面贴的小程序是否出现错误?还是它只出现在某个其他程序中,这是其中的一个片段?
-
没关系,该程序甚至无法编译。我有我的问题的答案。请提供一个小、完整程序来演示问题。请参阅sscce.org 了解更多信息。
-
你明白base
Release()会被调用两次吗? (这是你的意图吗?)
标签: c++ visual-c++ pure-virtual