2012-04-16 13 views
0

私はプログラム用の小さなプラグインシステムを作成しています。ファイルの一部はすでに実行されており、ファイルをロードしてコンストラクタ関数を呼び出すことができます。dll/shared-libraryからポインタを戻すと、seg-faultが発生します。

私はいくつかの(クラス)ポインタをハンドラに渡す必要がある関数の1つで、それがseg-faultを取得します。プログラムで

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は:: _シングルトンが他の場所で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; 
}; 

は、私が何をしないのですか?それを行う別の方法がありますか?

編集:私はあなたがNULL_singletonを初期化すると仮定してい

static RenderInterface* GetSingletonPtr() 
{ 
    return _singleton; 
} 

答えて

3

まあ、おかげでLuchianコードを簡素化しながら、あなたのシングルトンを初期化することはありませんので、それがクラッシュしBufferInterface後に*を逃しましたあなたが必要があると思います。その場合には、あなたの実装ファイル、:

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

他のいくつかのヒント:

  • ロバデストラクタを実装するシングルトン
  • を使用する前に、他のオプションは通常、あなたのクラスが本当にシングルトンである場合にもいけない、コピーコンストラクタと代入演算子(3のルール)
  • を必要とする意味コンストラクタはprivateですか?
  • bInterface = new BInterface();は、bInterfaceがポインタではないオブジェクトであるため、不正です。
+0

ありがとう、本当に助けてくれました。私は本当にシングルトンを設定するのを忘れて、3日間で私のミスを見つけることができませんでした! –

+0

static _singleton = new RenderInterface; if文を置き換えることができ、nULLについて心配する必要はありません。 –

+0

@OrgnlDave必ずしもそうではありません。 1RenderInterface'が実行時にのみ知られている他のものに依存するかどうかは関係ありません。これは通常、理由のためにこのように行われます。 –

関連する問題