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