1

答案可以在这里找到:

《Effective C++》第三版摘录,作者: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 的改变给出了一个直接的解决方案。开始在下面的评论中阅读该页面,因为我觉得我还没有到那里。

编辑:得到答案后,我明白了自己的问题。所以我重写了这个问题,所以答案适合这个问题。

谢谢,约翰

4

1 回答 1

7

不能在构造函数析构函数中调用虚函数。我在这里看不到纯虚函数,但如果cBaseApplication::Release碰巧调用了一个,那么每次你破坏一个cBaseApplication. 我不确定这是问题所在,因为我没有所有代码,但是您的代码需要此类问题。

于 2012-06-29T21:22:45.277 回答