0

プログラム用の小さなプラグイン システムを作成しています。その一部は既に完了しており、ファイルのロードとコンストラクター関数の呼び出しが機能しています。

関数の 1 つで、いくつかの (クラス) ポインターをハンドラーに戻す必要があります。そこで、セグ フォールトが発生します。

プログラム内:

class RenderInterface {
    public:
        RenderInterface();
        virtual ~RenderInterface();

        void RegisterBufferInterface(BufferInterface* interface)
        {
             bInterface = interface; // <---- this is where segfault occurs
        }
        void RegisterCameraInterface(CameraInterface* interface){}
        void RegisterRenderInterface(RenderInterface* interface){}

        static RenderInterface* GetSingletonPtr()
        {
            return _singleton;
        }

    private:
        static RenderInterface* _singleton;

        BufferInterface* bInterface;
        CameraInterface* cInterface
        RenderInterface* rInterface;
};

RenderInterface::_singleton は他の場所では 0 に設定されています。

登録関数内 (dll 内):

class BInterface : public BufferInterface {
    public:
        ... various stuff ....
}

class GLPlugin : public Plugin {
    public:
        Plugin() : bInterface(0) {}
        ~Plugin(){}

        void Initialize() // <--- is called after dll has been loaded
        {
            bInterface = new BInterface();

            InterfaceManager::GetSingletonPtr()->RegisterBufferInterface(bInterface); // segfault
            // register other stuff
        }
    private:
        BufferInterface* bInterface;
};

これが機能するために何が欠けていますか?それを行う別の方法はありますか?

編集:コードを簡素化する際に BufferInterface の後に * を逃した、Luchian に感謝

4

1 に答える 1

3

シングルトンを初期化しないため、クラッシュします。

static RenderInterface* GetSingletonPtr()
{
    return _singleton;
}

_singleton実装ファイルで初期化することを想定してNULLいます。その場合、次のものが必要になります。

static RenderInterface* GetSingletonPtr()
{
    if ( !_singleton )
        _singleton = new RenderInterface;
    return _singleton;
}

その他のヒント:

  • シングルトンを使用する前に他のオプションを評価します
  • 通常、デストラクタを実装すると、コピー コンストラクタと代入演算子も必要になります (3 つのルール)。
  • クラスが本当にシングルトンである場合、コンストラクターはそうではありませんprivateか?
  • bInterface = new BInterface();bInterfaceはポインタではなくオブジェクトであるため、不正です。
于 2012-04-16T00:08:31.247 に答える