2011-03-02 234 views
2

所以,我用一些全局靜態變量(記錄器)加載Dll。並沒有freelibrary。在關閉應用程序時,我調用了dll的方法,但全局靜態變量已經被銷燬。爲什麼???C++動態DLL生命週期中的靜態變量。或爲什麼他們死了?

+0

你到底什麼時候調用這些方法? – sharptooth 2011-03-02 07:28:19

+0

你能舉個例子說明你的意思嗎?這些靜態變量是什麼,你如何初始化它們,你是否從應用程序中爲它們分配任何東西,等等。 – 2011-03-02 07:32:02

+0

避免DLL中的靜態對象,除非它們是DllMain-safe。例如,包含FILE *或std :: fstream的對象是* NOT * DllMain-safe。請參閱最近的線程http://stackoverflow.com/questions/5114683/loading-dll-not-initializing-static-c-classes/5115008#5115008和這篇文章http://go.microsoft.com/FWLink/?LinkId = 84138 – atzz 2011-03-02 09:20:43

回答

1

當DLL被卸載時,DLL中的靜態變量將被銷燬。當進程退出時,如果沒有明確的FreeLibrary調用使其更早發生,主EXE的靜態變量被銷燬之前,會發生這種情況。

+0

如何捕捉這個? – 2011-03-02 08:07:01

+0

'static bool Loggable; class Flag { public: \t bool&live_detector_; \t flag(bool&live_detector):live_detector_(live_detector){ \t \t live_detector_ = true; \t} \t〜Flag(){ \t \t live_detector_ = false; \t} }; 標誌f(Loggable);'??? – 2011-03-02 08:09:19