在我的C++库中,我需要调用一个C库。 C库有两个函数:start()
和stop()
。 在我的应用程序中,我创建了这样一个单例:
class MySingleton {
private:
MySingleton() { start(); }
~MySingleton() { stop(); }
//other attributes here, singleton keeps a "state"
public:
static MySingleton& getInstance() {
static MySingleton m;
return m;
}
};
在其他通过shared_ptr
动态分配和“跟踪”的类中,我在析构函数中调用C库:
class Foo {
public:
~Foo() { //call c library }
};
问题是:我无法控制使用静态方法对单例的破坏。 在应用程序退出时,可能会在stop()
之后,在调用C库的另一个析构函数之前调用单例析构函数。 避免这种情况的最好方法是什么? 理想情况下,我应该说“调用singleton的析构函数作为最新调用”,这可能吗?
如果您真的想在应用程序中使用单例模式,您可以从Andrei Alexandrescu的书“Modern C++Design”中学习一些东西。 有一章专门讨论单例实现。 特别是,他在第6.8段中谈到了销毁令的问题,即执行长寿的单身人士。 他提供了一个具有确定性破坏顺序的实现。
但就我个人而言,我不会采用单例模式。 仅仅为了保证一个对象的单个实例,您就会创建这么多需要解决的问题。 如果您放弃这种方法,事情可能会变得简单得多(根据您的程序体系结构,有许多方法可以解决这个问题)。 是的,有人可以创建第二个实例,但它是你的程序,你可以访问它的源代码,所以你可以确保没有人这样做。