gpt4 book ai didi

c++ - 具有静态 unique_ptr 的单例是一个好习惯吗

转载 作者:行者123 更新时间:2023-12-05 08:10:29 26 4
gpt4 key购买 nike

我在一个项目中工作,其中单例通常是这样实现的:

class Singleton
{
public:
static Singleton& get();
virtual ~Singleton() = default;

// Used for unit tests
static void reset();

protected:
static std::unique_ptr<Singleton>& instance();
};
unique_ptr<Singleton>& Singleton::instance()
{
static unique_ptr<Singleton> instance;
return instance;
}

Singleton& Singleton::get()
{
auto& instance = instance();
if (!instance) {
// We cannot use make_unique<T>() as constructor is private
instance = unique_ptr<Singleton>(new Singleton());
}
return *instance;
}

void Singleton::reset() { instance().reset(); }
// Private constructor
Singleton::Singleton() {}

这里不需要线程安全。
使用 static unique_ptr 有什么好处吗? ?
使用 unique_ptr<T>(new T()) 创建单例的后果是什么? ?

由于我们的单例可以携带(某些)全局状态,因此为了测试目的实现了一个 public reset(),这是唯一的方法吗?可以改进吗?

我找到了一些 C++ 单例设计模式的例子 here .但从来没有像我这样用 unique_ptr 实现过。

最佳答案

有两种方法可以重置Meyer的单例:

#include <new>

class Singleton
{
public:
static Singleton& instance() {
static Singleton instance;
return instance;
}
virtual ~Singleton() = default;

// Option 1 - easy and convinient if Singleton is copyable or movable
void reset1() {
*this = {};
}
// Option 2 - works always
void reset2() {
this->~Singleton();
new (this) Singleton;
}

private:
Singleton() {}
};

第二个选项基本上与释放/创建 std::unique_ptr 完全相同,除了没有释放/分配存储。

关于c++ - 具有静态 unique_ptr 的单例是一个好习惯吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75249277/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com