Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果我这样写的话,我的单例类会导致什么错误_C++ - Fatal编程技术网

C++ 如果我这样写的话,我的单例类会导致什么错误

C++ 如果我这样写的话,我的单例类会导致什么错误,c++,C++,有人说,这会引起一些讨厌的虫子。但是这会导致什么错误呢?不使用指针可以很好地避免双重检查锁定模式。类似的错误 SomethingElse.cpp class Singleton { public: static Singleton *getInstance() { return &singleton; } private: Singleton(); ~Singleton(); private: static Singleton si

有人说,这会引起一些讨厌的虫子。但是这会导致什么错误呢?不使用指针可以很好地避免双重检查锁定模式。

类似的错误

SomethingElse.cpp

class Singleton {
public:
    static Singleton *getInstance() {
        return &singleton;
    }
private:
    Singleton();
    ~Singleton();
private:
    static Singleton singleton;
};
C++没有指定跨两个翻译单元的构造顺序(在本例中,这大致等同于不同的实现文件,一个是您的单例,另一个是我的单例)

现在,如果运行时决定在我的单例之前销毁你的单例(即在我的单例之后构造它),那么我的单例将尝试在其析构函数和构造函数中使用你的单例。然后接着



现在,如果你没有把它变成一个静态全局,在你的翻译单元中使用了一个函数范围静态的(可以使用DCLP),那么C++运行时会在你的前面构造你的单件,然后在我的后面摧毁你的单体。这是很好的执行顺序,单例通常是个坏主意,因为它们是全局可变状态。保持状态被包含有助于编写更容易理解的代码。@Ryan对它的编辑哈哈大笑,不知道我是怎么做到的mistake@Ryan是的,全局范围对象是可以避免的吗?@Howard:当然-只需创建一个常规类型,而不是单例,然后创建一个实例,在需要的地方传递。@Ryan这是一个很好的解决方案,但这将导致接口非常复杂。将这些共享的东西打包到一个

结构中
会很好。i、 e.无论如何,如果
静态单例单例,这个bug是可以避免的被移动到
getInstance()
中。这会导致另一个bug吗?
class SomethingSingleton {
public:
    SomethingSingleton() {
        auto* singleton = Singleton::getInstance();
        singleton->whatever();
    }
    ~SomethingSingleton() {
        auto* singleton = Singleton::getInstance();
        singleton->whatever();
    }
};
static SomethingSingleton something;