gpt4 book ai didi

c++11 - 使用shared_ptr的单例类实现

转载 作者:行者123 更新时间:2023-12-02 09:12:07 25 4
gpt4 key购买 nike

#include <iostream>
#include <memory>

using namespace std;

class Demo {
static shared_ptr<Demo> d;
Demo(){}
public:
static shared_ptr<Demo> getInstance(){
if(!d)
d.reset(new Demo);
return d;
}
~Demo(){
cout << "Object Destroyed " << endl;
}

};

// shared_ptr<Demo> Demo::d(new Demo); // private ctor is accepted

shared_ptr<Demo> Demo::d;

int main()
{
shared_ptr<Demo> d(Demo::getInstance());
cout << d.use_count() << endl;

return 0;
}
  1. 这是使用shared_ptr实现单例类的正确方法吗
  2. 请参阅上面的注释行来初始化静态shared_ptr,我们为什么可以在这里创建一个对象来使用私有(private)构造初始化shared_ptr

最佳答案

这不是线程安全的:两个线程调用 getInstance会导致数据竞争。一种常见的方法是使用函数范围静态变量:

static shared_ptr<Demo> getInstance(){
static shared_ptr<Demo> d(new Demo);
return d;
}

当控制第一次传递其定义时,保证以线程安全的方式对此类变量进行一次初始化。

但此时,还不清楚为什么要使用 shared_ptr 。你也可以这样做

static Demo& getInstance(){
static Demo d;
return d;
}

这是单例的教科书实现(好吧,其中之一)。

<小时/>

回复:使用私有(private)构造函数进行初始化。我不确定我是否理解你困惑的本质。你问为什么Demo::getInstance可以使用 Demo 的私有(private)构造函数?嗯,因为它是 Demo 的成员,并且类的成员可以访问该类的私有(private)成员。你问为什么Demo::getInstance可以调用shared_ptr<Demo>::reset()通过Demo*指针?嗯,因为reset()shared_ptr 的公共(public)成员函数,以指针作为参数。您认为此过程的哪一部分存在争议?

关于c++11 - 使用shared_ptr的单例类实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33379162/

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