超出返回引用的单一实例生存期
Singleton lifetime beyond returning reference
我和一位同事正在讨论如何制作单例,结果证明我们的做法不同。
我的单身人士 :
class Singleton
{
public:
static Singleton* getInstance()
{
if(!instance) instance = new Singleton();
return instance;
}
~Singleton()
{
if(instance) delete instance;
}
private:
Singleton() {}
static Singleton* instance;
};
他的单身人士:
class Singleton
{
public:
static Singleton& getInstance()
{
static Singleton instance;
return instance;
}
private:
Singleton() {}
};
当然,这些示例已简化以供阅读。我喜欢他的解决方案,因为它更短,不知何故更优雅,但有些东西让我烦恼......
当他的getInstance()
方法返回实例时,我们不是离开了声明它的范围并对其进行了破坏吗?你如何解释它超越return
的生命周期?
您需要在C++中查看存储类。任何声明为 static (或 extern( 的对象都具有静态存储,并在程序结束时以与构造相反的顺序销毁。裸静态对象的构造顺序不是确定性的和麻烦的,尤其是在多线程中。函数本地静态对象(又名斯科特·迈耶的单例(OTH 是在第一次调用拥有函数时构造的 ALAP,并且自 C++11 以来在一个神奇的线程安全庄园中(即没有双重构造(。我会在您朋友的类中添加以下声明,以使单例实际上单身:
class Singleton{
//...
Singleton(Singleton const&)=delete;
Singleton(Singleton&&)=delete;
auto& operator=(Singleton const&)=delete;
auto& operator=(Singleton &&)=delete;
};
相关文章:
- CRTP 单一实例不完整类型或非文本类型
- make_unique 不会为创建单一实例进行编译
- C++ 中的基本单一实例对象
- 在声明或实现中延迟初始化C++单一实例
- 使用单一实例类作为派生类时,如何访问基类中的函数
- 单一实例对象是否通过线程安全返回shared_ptr
- std::system 实例化单一实例对象时的异常
- 超出返回引用的单一实例生存期
- 在单一实例类中将成员指针设置为 null 的正确方法是什么
- 使用unique_ptr的单一实例对象
- C++管理单一实例中的堆/指针
- 单一实例对象的未解决外部符号链接错误
- 为什么单一实例必须在以下代码中初始化
- 实现单一实例模式
- C++用于深层继承的模板单一实例基类
- 任意对象的单一实例替代项
- 在C++中调用单一实例对象的正确方法
- 编译时单一实例超过一次性实例化检测
- 创建一个基类,该基类为派生类实现单一实例
- 导致链接器错误的单一实例:"already defined"