智能指针

重点:四种智能指针及底层实现:auto_ptr、unique_ptr、shared_ptr、weak_ptr

std名称空间定义了3种智能指针。

unique_ptr<T> 

具有唯一性,不会有多个该指针指向同一地址,该指针不可复制。

创建

必须是直接初始化

 可以用传统的new

unique_ptr<double> pdata{new double{999.0}};

也可以用 make_unique<T>() 方法

unique_ptr<double> pdata {make_unique<double>(999.0)};
auto pdata {make_unique<double>(999.0)};

 修改和访问

*pdata = 8888;
cout << *pdata << endl;

取地址 get()

pdata.get();

重置 reset()

不带参数重置为nullptr,带参数重置为指向参数这个对象的指针,

如果参数是unique_ptr,需要使用 release() 放弃其控制权。

unique_ptr <string> p3 {new string ("Hi, Trex")};
p2.reset(p3.release());

 

把所有权转换给另一个智能指针 release()

unique_ptr<string> p2(p1.release()) //p1放弃对于指针的控制权

 

shared_ptr<T>

多个指针指向同一地址,会增加引用计数。引用计数为0则自动释放。

创建

除了用make_unique<T>()

还可以用另外一个share_ptr()来创建。

share_ptr<double> pdata2 {pdata};

 

weak_ptr<T>

不控制所指对象生命期的智能指针

指向 shared_ptr<T> 时不增加引用计数,不能防止它指向的对象被释放。但也可以阻止在被释放后访问悬挂指针的情况

创建

shared_ptr <int> p1{make_unique<int>(250)};
weak_ptr <int> p2 (p1);

赋值

可以把shared_ptr或 weak_ptr 用 = 赋值给另一个weak_ptr

 

posted on 2022-06-05 11:27  MIXTAPE_208  阅读(25)  评论(0编辑  收藏  举报

导航