c++ - C++ 中的最新调用

标签 c++ c++11

在我的 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/

相关文章:

C++ 文件中的最后一个字符

c++ - 内核调用产生错误 "error: a host function call cannot be configured"。调用有什么问题?

c++ - Qt::nativeEvent 调用

c++ - 如何调试此 C++11 线程代码?

c++ - 解析 XML 文件 : Root Nodes has no child nodes

c++ - 在 C++ 中的多态方法上使用 std::for_each

c++ - 将函数指针及其参数作为 thrust::tuple 传递给全局函数

c++ - std::initializer_list 的实现

c++ - 如何区分函数参数中的左值和右值引用

c++ - 将 std::vector<std::unique_ptr<T>> 分配给另一个 std::vector<std::unique_ptr<T>>