C++ 调用'shared#ptr.get()`vs copy initialization,what';有什么区别?

C++ 调用'shared#ptr.get()`vs copy initialization,what';有什么区别?,c++,shared-ptr,C++,Shared Ptr,第一版打印使用_计数=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; shared_ptr s{make_shared(15)}; 自动b=

第一版打印使用_计数=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;  
shared_ptr s{make_shared(15)};
自动b=s;
产酸
每次创建共享资源的副本时,使用计数都会增加,因为这样您就有了对正在跟踪的基础资源的附加句柄

为了获取底层指针的值,shared_ptr有一个名为
get
的成员函数。此函数将返回被跟踪资源的地址,它将而不是创建跟踪同一指针的附加共享\u ptr


潜在危险 在第一个代码段中,您实际上有两个引用同一资源的shared_ptr实例,但在后一个代码段中,您有三个实例

区别在于

  • auto a=s
    将创建
    s
    的副本,
    a
    的类型是
    s
    的类型(共享)
  • 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
int*ptr=nullptr;
{
std::shared_ptr sp{make_shared(15)};
ptr=sp.get();
}
std::不能使用
共享\u ptr
。除非对象没有(逻辑)所有者。
int * ptr = nullptr;

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

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