C++中的最新调用 我的C++库需要调用C库。C库有两个功能:启动和停止。在我的应用程序中,我创建了这样一个单例: class MySingleton { private: MySingleton() { start(); } ~MySingleton() { stop(); } //other attributes here, singleton keeps a "state" public: static MySingleton& getInstance() { static MySingleton m; return m; } };

C++中的最新调用 我的C++库需要调用C库。C库有两个功能:启动和停止。在我的应用程序中,我创建了这样一个单例: class MySingleton { private: MySingleton() { start(); } ~MySingleton() { stop(); } //other attributes here, singleton keeps a "state" public: static MySingleton& getInstance() { static MySingleton m; return m; } };,c++,c++11,C++,C++11,在其他通过shared_ptr动态分配和跟踪的类中,我在析构函数中调用C库: class Foo { public: ~Foo() { //call c library } }; 问题是:我无法控制使用静态方法销毁singleton。在应用程序退出时,可能会在另一个析构函数停止后调用C库之前调用单例析构函数。避免这种情况的最好方法是什么?理想的情况下,我应该把单体析构函数称为最新调用,是否可能?< p>如果你真的想在应用程序中使用单模式,你可以从Andrei Alexandrescu的

在其他通过shared_ptr动态分配和跟踪的类中,我在析构函数中调用C库:

class Foo {
public:
    ~Foo() { //call c library }
};

问题是:我无法控制使用静态方法销毁singleton。在应用程序退出时,可能会在另一个析构函数停止后调用C库之前调用单例析构函数。避免这种情况的最好方法是什么?理想的情况下,我应该把单体析构函数称为最新调用,是否可能?

< p>如果你真的想在应用程序中使用单模式,你可以从Andrei Alexandrescu的书《现代C++设计》中获取一些东西。有一章专门介绍单例实现。特别是,他在第6.8段中解决了销毁令的问题,即实施长寿单例。他提供了一个具有确定性销毁顺序的实现


但就个人而言,我不会使用单例模式。为了保证对象的单个实例,您创建了很多需要解决的问题。如果您放弃这种方法,事情可能会变得简单得多。根据您的程序的体系结构,有许多方法可以解决这个问题。是的,有人可以创建第二个实例,但它是你的程序,你可以访问它的源代码,所以你可以确保没有人这样做。

记住,不要让你的类承担太多的责任。静态实例肯定会在主出口后被破坏?那么你真的无法保护自己免受静态初始化失败的影响。而是创建两个API函数,一个必须先调用,另一个必须最后调用:。然后记录这些函数,并强调必须在何时何地调用它们。如果库的用户没有这样做,如果它不起作用,那是他们自己的错。如果您正在使用共享的\u ptr跟踪某个东西,那么只有在该共享的\u ptr被销毁,然后在销毁单例后调用C库的情况下,共享的\u ptr也是静态的。简单的解决方案-使共享的_ptr具有自动存储持续时间,例如,通过在main中定义它,使其始终在单例之前被销毁。更通用的解决方案是避免静态,因为这样可以更容易地使用具有自动存储持续时间的对象来控制生命周期以及构造/销毁顺序。您可以使用来控制构造/销毁吗?