1

答えはここにあります:

Scott Meyers 著、Effective C++、第 3 版からの抜粋

URL投稿者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 は私を怖がらせます :s

2 つのどちらかを選択する必要があるようですが、選択したくありません。ここで何が起こっているのでしょうか。

よろしく、ジョン

編集:いくつかのコードを追加しました。そこで仮想関数を呼び出すので、エランは正しいようです

編集: 例に追加 [ virtual void OnLostDevice() = 0; ]。アブストラクトから ascoop に変更すると、すぐに解決策が得られました。私はまだそこにいないと感じたので、下のコメントでそのページを読み始めました.

編集:答えを得た後、私は自分の問題を理解しました。だから私は質問を書き直したので、答えは質問に合っています。

ありがとう、ジョン

4

1 に答える 1

7

コンストラクタとデストラクタで仮想関数を呼び出してはなりません。ここには純粋仮想関数は表示されませんが、cBaseApplication::Releaseたまたま呼び出すと、 を破棄するたびにそのエラーが発生しますcBaseApplication。私はすべてのコードを持っていないので、それが問題かどうかはわかりませんが、あなたのコードはその種の問題を必要とします。

于 2012-06-29T21:22:45.277 に答える