在我的 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 库的另一个析构函数之前被调用的情况。避免这种情况的最佳方法是什么?理想情况下,我应该说“将单例的析构函数称为最新调用”,这可能吗?
最佳答案
如果你真的想在你的应用程序中使用单例模式,你可以从 Andrei Alexandrescu 的书《Modern C++ Design》中获取一些内容。有一个章节专门讨论单例实现。他特别在“6.8 实现具有长寿功能的单例”段落中解决了销毁顺序的问题。他提供了具有确定性销毁顺序的实现。
但就我个人而言,我不会采用单例模式。为了保证对象的单个实例,您创造了很多需要解决的问题。如果您放弃这种方法,事情可能会变得更加简单(根据程序的架构,有很多方法可以解决问题)。是的,有人可以创建第二个实例,但它是您的程序,您可以访问其源代码,因此您可以确保没有人这样做。
关于c++ - C++ 中的最新调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62729104/