Meyers Singleton和动态图书馆

Meyers singleton and dynamic libraries

本文关键字:图书馆 动态 Singleton Meyers      更新时间:2023-10-16

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;
}

这可能会导致一些内存泄漏检查器报告误报(或者,也许根据您的观点是真正的阳性),这很刺激。