在此先感謝。我現在正在爲C++中的大系統開發一個插件。在我的插件中,我有一些靜態變量。我發現,當它在Linux上以調試模式編譯時,它可以正常工作,沒有任何問題。當它以RELEASE模式編譯時,即某些優化是由編譯器完成的,那麼當我卸載插件時,靜態變量不會被刪除(靜態變量類的析構函數永遠不會被調用),所以內存永遠不會被釋放,下次我重新加載插件時,會導致主程序崩潰!在C++插件中卸載靜態實例變量?
任何人都可以解釋我爲什麼當插件卸載靜態變量不被破壞?注意:靜態變量是一個靜態實例,而不是一個指針!
class MySettings
{
public:
static MySettings& Instance() {
static MySettings theSingleton;
return theSingleton;
}
virtual ~MySettings();
}
在插件某處
,它被稱爲像這樣
....
MySettings &s = MySettings::Instance();
s.xxx();
....
當我編譯和調試模式跑,我印刷從析構函數的一些信息,它看起來像的實例當插件未被鎖定時,適當破壞。但是,當我編譯和釋放模式運行,析構函數沒有被調用時,該插件unpluged。 我不是插件管理器開發人員,不能講太多。非常感謝你的幫助!
這裏是一段代碼,其加載插件庫。
newLib._libHandle = ::dlopen(path_to_the_plugin_lib, RTLD_LAZY | RTLD_GLOBAL);
if(! newLib._libHandle) {
cerr << "dlopen failed for: " << path << " - "
<< ::dlerror();
return "";
我終於得到它的工作。但仍然不明白爲什麼。這是我做的:
class MySettings
{
public:
static MySettings& Instance() {
return theSingleton;
}
private:
static MySettings theSingleton;
virtual ~MySettings();
}
MySettings MySettins:theSingleton;
Sinece的應用程序是非常大的數百萬行代碼。我的疑問是,當gcc在RELEASE模式下編譯時,優化出現問題。
class MySettings public: static MySettings&Instance(){ static MySettings theSingleton; return theSingleton; } virtual〜MySettings(); – user1073719
編輯問題並在其中添加此信息! – karlphillip
這取決於如何加載插件。什麼插件? –