私はクラス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年
あなたの質問に 'foo'がどのように構築されているか説明していません。それはdllの内部に構築され、工場のファンクションまたはゲッターを介して公開されますか?あるいは、何とか返されるdllの中に 'foo'という静的なインスタンスが1つありますか? –
FreeLibraryの前に〜foo()を呼び出さなければならないのを防ぐことはできません。 – KonstantinL
@RudolfsBundulis:ご意見ありがとうございます。私は自分の質問を編集し、fooがどのように構築され公開されているかを示すInterfaceを追加しました。 –