Meyers Singleton和动态图书馆
Meyers singleton and dynamic libraries
Meyers Singleton在带有动态库的情况下工作吗?
IE。一个定义单例的库,其他图书馆在自己的编译单元中?
(我想这没关系,但是特定的体系结构是OS x 上的框架的应用程序)
我正在使用vanilla meyers singleton模式:以下Instance()
方法在实用程序类的标题文件中定义了内联(在动态库中定义):
static Logger& Instance()
{
static Logger singletonInstance;
return singletonInstance;
}
复制构造函数和operator=
被声明为私有且未实施,所以我们应该做好,对吗?
现在,如果我链接该库从主应用程序定义单元顿,我可以看到构造函数被称为多次 ..带有this
的不同地址实际的单例,但多个班级实例。
所以我想知道动态库方法是拧紧Meyers Singleton还是每个编译单元 - 库,主应用程序 - 包括Singleton的标题(有效声明和定义实例>()方法将获得" 它是自己的singleton实例"?
真的不太确定该如何看待我的观察结果,所以任何提示都非常感谢!
您需要在标题中 em em> Instance
,然后在动态库中定义 (大概是Logger
是相同的定义在)。而且您需要丢弃static
。并且您需要确保Instance
在使用可见性工具时具有默认可见性。
从您的描述中,听起来您已经在标题中定义了此功能。这将为包括标题包含标题的每个人对Instance
的私人定义,从而为每个人的私人定义,从而在Instance
中对static Logger
的私人定义。
您可以声明Instance
inline
,这将为您期望的所有语义提供所有内容(与在标题中宣布并在Dylib中定义相同)。但是我的建议是进行内联确认我告诉您的正确内容(这很容易),然后概述为Dylib(再次确认)。
一旦概述,您的设计就可以正常工作。
话虽如此,只能保证在C 11中工作。也就是说,局部静态不是C 98/03中的线程安全,而是在C 11和更高版本中。但是,在OS X上,即使在C 03语言模式中,它们也是线程安全的。
另外一个警告:如果您在AtexIT链中访问Instance()
(或在全球对象的击曲线中),则可能在 Instance()
中静态本地singletonInstance
破坏后可能发生访问,从而导致未定义的行为。如果您不使用atexit()
注册内容,并且您的全局驱动器不致电Instance()
,那么您是安全的。否则你不是。如果您不安全,则可以有目的地泄露它:
Logger& Instance()
{
static Logger* singletonInstance = new Logger;
return *singletonInstance;
}
这可能会导致一些内存泄漏检查器报告误报(或者,也许根据您的观点是真正的阳性),这很刺激。
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- C++中的动态铸造故障
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 内联映射初始化的动态atexit析构函数崩溃
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 控制允许动态运行c++的并发操作数
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 输出没有重复元素的动态数组(收缩数组)C++
- C++为线程工作动态地分割例程
- 正在插入动态数组
- 在c++中使用动态分配的问题
- C++中的动态对象与非动态对象
- 如何在动态数组上使用搜索函数
- 视觉studo 2019中的漫画和静态/动态绑定
- 从C++中的数字输入动态创建矩阵
- 如何从QToolBox中动态创建的QLineEdit中获取文本
- C++ 动态数组每次添加时将大小增加 1 - 错误
- Meyers Singleton和动态图书馆