【问题标题】:R6025 Pure virtual function call: What is and how to resolveR6025 纯虚函数调用:什么是以及如何解决
【发布时间】: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 了解更多信息。
  • 你明白baseRelease()会被调用两次吗? (这是你的意图吗?)

标签: c++ visual-c++ pure-virtual


【解决方案1】:

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

【讨论】:

  • 你是对的,我确实在析构函数中调用了虚拟函数。临时解决方案,在抽象函数上实现了一个空范围。我正在进一步研究这个答案。
  • 接受这个答案是真的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
  • 2012-05-29
  • 2014-08-05
  • 2015-08-27
  • 2019-04-19
相关资源
最近更新 更多