单一实例对象是否通过线程安全返回shared_ptr
Is Singleton object returned through shared_ptr thread-safe?
我正在阅读问题的答案。C++ 单例设计模式
其中一个答案建议使用 shared_ptr 来保证多个静态对象访问单一实例对象时的生存期。我注意到这里的shared_ptr是使用 new 构造的,并且是按值返回的。
将 new 用于shared_ptr构造原子/thread_safe吗?
我的第二个困惑是关于RVO。我尝试在我的实现中创建两个单例对象。
shared_ptr显示三个_Uses和一个_Weak。我预计_Uses数是两个。优化在Visual Studio 15.5.6上完全完成。RVO 在这里不起作用吗?
class Singleton
{
public:
Singleton(Singleton const&) = delete;
Singleton& operator=(Singleton const&) = delete;
static std::shared_ptr<Singleton> instance()
{
static std::shared_ptr<Singleton> s{new Singleton};
return s;
}
~Singleton() {}
private:
Singleton() {}
};
int main()
{
std::shared_ptr<Singleton> obj1 = Singleton::instance();
std::shared_ptr<Singleton> obj2 = Singleton::instance();
return 0;
}
将 new 用于shared_ptr构造原子/thread_safe吗?
是的,创建shared_ptr
是线程安全的,因为static
初始化是线程安全的(另请参阅此问题(
shared_ptr显示三个_Uses和一个_Weak。我预计_Uses数是两个。优化在Visual Studio 15.5.6上完全完成。RVO 在这里不起作用吗?
您的使用计数为 3,因为shared_ptr
被声明为 static
,这意味着当它初始化时,将创建对象,因此使用计数增加 1 (+2 对于主中的两个shared_ptr
(。此使用计数仅在销毁static shared_ptr
时再次减少,并且在程序终止时发生这种情况。
相关文章:
- AcquireCredentialsHandleA() 返回 PFX 文件的0x8009030e(安全包中没有可用的凭据
- 将传入的网络"char*"数据转换为"uint8_t"并返回的安全方法是什么?
- 返回从字符串文本创建的静态string_view是否安全?
- 在 c++ 中从执行的 shell 命令获取返回状态的安全方法是什么?
- 从内部使用静态 std::string 的函数返回 const char * 是否安全?
- 单一实例对象是否通过线程安全返回shared_ptr
- 这安全吗?右值和引用返回值
- 什么安全?从函数返回结构或指针
- 从 C# 到C++和返回的数组,没有不安全的代码
- 是返回*这在 C++ 中是安全的
- 从函数安全返回和处理动态分配的内存,C++ 11
- 通过引用从 c++ 函数异常返回对象是否安全
- 程序流并以安全而雄辩的方式正确返回Main()
- 通过引用返回共享对象是否安全"std::lock_guard<mutex>"?
- 标准::数组是否可安全返回
- 返回强制引用是否安全
- 返回 vector<T><auto_ptr> 是否安全?
- 从DLL返回std::wstring是否安全
- 在所有std::futures完成之前从函数返回是否安全
- 将子结构值设置为对象构造函数中安全的纯虚拟函数返回的值