2017-03-27 8 views
1

私はクラスfoo(std::vector<double> values)の私的静的メンバー変数を持っています。 doo(インタフェースクラスと実装クラスイディオム)にfooのカプセル化されたオブジェクトが1つあります。dll内の静的メンバー変数の存続期間

class foo 
{ 
public: 
    foo(); 
    ~foo(); 

private: 
    static std::vector<double> values; 
}; 

と定義ファイル 'foo.cpp':fooは私は私のインターフェイスクラス(ファイルを持っているのdll、内部で構成され

#include "foo.h" 

std::vector<double> foo::values; 

foo::foo() 
{ 
    values.resize(10UL); 
} 

foo::~foo() 
{ 
    for (auto& v :values) 
    { 
     v = 99.9; 
    } 
} 

これはヘッダファイル 'foo.hという' です'interface.h'):

class interface 
{ 
public: 
    interface(); 
    ~interface(); 

    foo myFoo; 
}; 

extern "C" foo* getFooObject(); 

そして、私の 'interface.cpp' ファイルでgetter関数:

#include "interface.h" 

interface::interface(){} 

interface::~interfacet(){} 

interface myInterface; 

extern "C" 
{ 
     foo* getFooObject() 
     { 
      return &myInterface.myFoo; 
     } 
} 

私の主なプログラムでは、::LoadLibrary(libraryName)(Windows OS)でDLLをロードします。 ::FreeLibrary(libraryHandle)を実行し、デストラクタでブレークポイントを設定すると、~foo()variablesは既に破壊されているようです。誰かがDLLの静的メンバ変数の生涯を助けてくれますか?デストラクタが呼び出されたときに、静的メンバー変数がすでに破棄されているのを防ぐにはどうすればよいですか?

ありがとうございます。

おそらく同様の質問:

c++ Static variables in dynamic DLL lifetime. or why they dead?

私はあなたがここに複数の問題に実行している2016年

+2

あなたの質問に 'foo'がどのように構築されているか説明していません。それはdllの内部に構築され、工場のファンクションまたはゲッターを介して公開されますか?あるいは、何とか返されるdllの中に 'foo'という静的なインスタンスが1つありますか? –

+0

FreeLibraryの前に〜foo()を呼び出さなければならないのを防ぐことはできません。 – KonstantinL

+0

@RudolfsBundulis:ご意見ありがとうございます。私は自分の質問を編集し、fooがどのように構築され公開されているかを示すInterfaceを追加しました。 –

答えて

1

インテル®ParallelスタジオXEでのVisual Studio 2013を使用します。

  1. ので、コードを複数のファイルに分割し、valuesmyInterfaceの両方を静的変数として定義します(実際には、valuesは、myInterfaceの前に破壊される可能性があります)。両方が同じコンパイルユニットにある場合は、それに数えることができます(this参照)。
  2. 適切な破壊順序であっても、FreeLibraryの呼び出し後にクライアント側で取得されたポインタは無効になります。

だから、一番下の行は、あなたが達成しようとしているものは不明ではないということです(なぜあなたはRun-Time Dynamic Linkingの代わりLoad-Time Dynamic Linkingを使用するようにしたいですか?)。実行時に読み込む必要があるモジュラーシステムを作成している場合でも、dllから取得したオブジェクトがライブラリの存続時間を超えないように適切に設計します(たとえば、工場で作成されたすべてのオブジェクトを適切に破棄するマネージャクラスFreeLibraryが呼び出される前に、対応するデストラクタ関数を呼び出すことによって関数が呼び出されます)。

関連する問題