【发布时间】:2014-05-24 17:58:25
【问题描述】:
我目前正在将我的项目从 Windows 移植到 Linux。
该项目由一个“主”共享库、几个插件(也是共享库)和一个启动器应用程序组成。
在“主”共享库中有一个模板单例类,另一个类可以从该类继承以使用单例模式。
模板单例类实现如下:
template<class T>
class Singleton
{
public:
static T* getInstance()
{
if(!m_Instance)
{
m_Instance = new T();
}
return m_Instance;
}
private:
static T* m_Instance;
protected:
Singleton()
{
assert(!m_Instance);
m_Instance = (T*)this;
}
~Singleton()
{
m_Instance = 0;
}
};
template<class T> T* Singleton<T>::m_Instance = 0;
从 Singleton 类继承的类是 - 例如 - Logger 类。 所以每当我打电话时
Logger::getInstance()
我得到了一个有效的记录器类实例。
对于 Windows,这适用于多个 DLL。
如果我在“主”dll 中实例化记录器并尝试在插件 A 和 B 中获取实例,它将始终返回相同的实例。
但在 Linux 上我无法重现此行为。对于插件 A 和 B,断言
assert(!m_Instance);
触发,程序停止。
我必须做些什么才能获得与在 Windows 中的 dll 相同的行为?
我尝试使用 -rdynamic 链接,但不幸的是这并没有解决问题。
【问题讨论】:
-
反模式单例的模板类完全没用
-
getInstance成员函数中的条件是否会成立? -
@DieterLücking:Andrei Alexandrescu 的经典著作《现代 C++ 设计》包含一些很好的讨论和代码示例。您可能会在 Loki 库中找到该代码。
-
@faranwath 是的,在调用 getInstance 之前没有实例化单例时
-
@FelixK。是的,但我喜欢显式实例化我可能拥有的任何单例,而不是依赖延迟初始化。
标签: c++ linux shared-libraries