gpt4 book ai didi

c++ - 调用 `shared_ptr.get()` 与复制初始化,有什么区别?

转载 作者:行者123 更新时间:2023-11-28 06:50:10 25 4
gpt4 key购买 nike

第一版打印use_count = 2;

shared_ptr<int> s{make_shared<int>(15)};
auto b = s;
cout<<s.use_count()<<endl;
auto c = s.get();
cout<<s.use_count()<<endl;
cout<<*c<<endl;

第二个版本use_count = 3;

shared_ptr<int> s{make_shared<int>(15)};
auto b = s;
cout<<s.use_count()<<endl;
auto c = s;
cout<<s.use_count()<<endl;
cout<<*c<<endl;

问题:

  • 为什么两个版本的行为不同?

最佳答案

介绍

每次复制 shared_ptr 时,use-count 都会增加,因为这样您就有了一个额外的句柄来跟踪底层资源。

为了获取底层指针的值,shared_ptr 有一个名为get 的成员函数。此函数将返回被跟踪资源的地址,它不会创建一个额外的 shared_ptr 来跟踪相同的指针。


潜在危险

在您的第一个片段中,您实际上有 2 个 shared_ptr 实例,它们引用相同的资源,但在后一个片段中,您有三个。

区别在于;

  • auto a = s 将创建 s 的拷贝,a 的类型是 s 的类型>(一个shared_ptr)
  • auto b = s.get () 会用 s 管理的被跟踪资源的地址初始化 b,因此它将是一个原始指针

如果您不清楚自己在做什么,调用 .get () 可能很危险,如以下代码片段所示。

int * ptr = nullptr;

{
std::shared_ptr<int> sp { make_shared<int> (15) };
ptr = sp.get ();
}

std::cout << *ptr << std::endl; // (A), dangling pointer

在我们的嵌套范围内,我们创建了一个名为 spshared_ptr,我们要求它使用 dynamic 跟踪 int存储持续时间 通过调用 make_shared 创建。

我们通过调用sp.get()获取这个int的地址,并将其赋值给ptr

sp 的范围结束时,sp 将释放管理的资源,因为不再有 *shared_ptr*s 引用它。

通过尝试打印 *ptr 的值,我们在 (A) 中调用了未定义的行为,因为该值不可用,它随着 sp 的销毁而被销毁。

关于c++ - 调用 `shared_ptr.get()` 与复制初始化,有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24097267/

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