提前致谢。我现在正在为 C++ 中的大型系统开发一个插件。在我的插件中,我有一些静态变量。我发现当它在 Linux 上以调试模式编译时,它运行良好,没有任何问题。当它在RELEASE模式下编译时,即编译器做了一些优化,然后当我卸载插件时,静态变量没有被删除(静态变量类的析构函数永远不会被调用。)所以内存永远不会释放并且下次我重新加载插件时,它会导致主程序崩溃!
谁能解释一下为什么卸载插件时静态变量没有被破坏?注意:静态变量是静态实例,而不是指针!
class MySettings
{
public:
static MySettings& Instance() {
static MySettings theSingleton;
return theSingleton;
}
virtual ~MySettings();
}
在某处的插件中,它是这样调用的
....
MySettings &s = MySettings::Instance();
s.xxx();
....
当我在调试模式下编译和运行时,我从析构函数中打印了一些信息,当插件被拔出时,看起来实例被正确解构了。但是当我在发布模式下编译和运行时,当插件被拔出时,析构函数永远不会被调用。 我不是插件管理器开发人员,不能说太多。非常感谢你的帮助!
这是加载插件库的一段代码。
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;
由于该应用程序非常庞大,包含数百万行代码。我怀疑当 gcc 在RELEASE模式下编译时,优化出了问题。