2017-03-27 278 views
1

我有一個foo類的私有靜態成員變量(std::vector<double> values)。有一個foo封裝的對象(接口類和實現類成語)。這是頭文件「foo.h中」:dll中靜態成員變量的生存期

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

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

而且定義文件「Foo.cpp中」:

#include "foo.h" 

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

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

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

富是DLL,在那裏我有我的接口類(文件內部構造'interface.h'):

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

    foo myFoo; 
}; 

extern "C" foo* getFooObject(); 

和getter函數在我的 'interface.cpp' 文件:

#include "interface.h" 

interface::interface(){} 

interface::~interfacet(){} 

interface myInterface; 

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

在我的主程序中,我使用::LoadLibrary(libraryName)(Windows操作系統)加載dll。當我執行::FreeLibrary(libraryHandle)並在析構函數中設置斷點時~foo()variables似乎已經被破壞。有人可以幫助我在靜態成員變量的生命期在DLL中?如何防止調用析構函數時靜態成員變量已被銷燬?

預先感謝您。

可能是一個類似的問題:

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

我使用Visual Studio 2013與英特爾Parallel Studio XE 2016

+2

你的問題沒有解釋'foo'是如何構建的。它是在DLL內部構建的,並通過工廠函數或getter暴露出來?或者,也許有一個單一的靜態實例'foo'裏面的dll得到返回莫名其妙? –

+0

你不能阻止,必須在FreeLibrary之前調用〜foo()。 – KonstantinL

+0

@RudolfsBundulis:感謝您的評論。我編輯了我的問題並添加了界面以顯示foo是如何構建和暴露的。 –

回答

1

您正在運行到多個問題在這裏:

  1. 由於您已將代碼拆分爲多個文件,並且valuesmyInterface都被定義爲您無法修改的靜態變量t的銷燬序列(實際上,values可能在myInterface之前被銷燬)。如果兩者都在同一個編譯單元中,則可以指望(請參閱this)。
  2. 即使有適當的銷燬順序,在調用FreeLibrary之後,在客戶端獲得的指針也是無效的。

因此,底線是,它是不是不清楚你想達到什麼(你爲什麼要使用Run-Time Dynamic Linking代替Load-Time Dynamic Linking?)。即使你正在製作一個需要在運行時加載東西的模塊化系統,也要適當地設計它,以便從dll中獲得的對象不會超過庫的生命週期(例如,一個管理員類可以正確銷燬通過工廠創建的所有對象通過在調用FreeLibrary之前調用相應的析構函數來執行函數)。