Effective Mocern C++ - Item 18-Use unique_ptr for exclusive-ownership resource management

                                                 孤独,是忧愁的伴侣,也是精神活动的密友。——(黎)纪伯伦


智能指针就是一种代理模式,代理裸指针,帮助用户管理堆内存。 (倒是与标准库中的iterator class有些类似,其封装了对容器元素的索引)。


补充:

 

1)下文中有提到,一个makeInvestment函数返回类型是unique_ptr, 在makeInvestement函数内部,应该会生成一个局部的unique_ptr对象,指向在堆上分配的资源, 当函数退出时,这个临时局部对象被销毁,这不会导致刚刚分配的资源被销毁吗?

 

---不会, 因为 函数返回的是一个右值(e.g auto m = makeInvestment();对函数调用者来说,看到的返回值是右值),所以这时调用的是unique_ptr的移动构造函数,自动实现了所有权的接管。 有人用如下方式理解也可以:

  一个unique_ptr对象不能与其他的unique_ptr对象指向相同的资源,unique_ptr对象之间相互赋值时,只能通过std::move来进行,实现所有权的转让。

unique_ptr对象之间不能通过=号赋值!所有权的传递必须通过std::move。

unique_ptr类是一个删除了拷贝构造函数、保留了移动构造函数的指针封装类型。

 

Note:

shared_ptr不能转换为unique_ptr.   反之可以,比如,下文中提到的工厂函数。

 


-----unique_ptr的速度很快 ,占用资源少::

----- unique_ptr独占其指向的资源,当一个unique_ptr被销毁时,如果其不是null的话就会对其包裹的指针(堆内存)

进行delete操作::


 

-----讲到一个典型的应用场景,即 工厂函数返回一个unique_ptr<T>, 返回的这个unique_ptr可以被传给

container,container又可以被传给另一个对象的成员,一般情况下都能保证资源在最后能被释放:

 

-------- 默认情况下,unique_ptr使用delete来最后销毁其包裹的指针指向的资源,但是,可以给自定义

一个销毁函数,这个自定义的销毁函数可以是lambda函数,传统函数等等 (使用lambda函数效率更高),

自定义的销毁函数必须作为std::unique_ptr的second type入参::

-------- 对上面的代码进行详细解释:

 

-------- 使用c++14的话,由于其function return type deduction特性,上面的代码可以更加简洁::

-------- 定制销毁函数的时候,可以使用不同类型的函数,例如,labmda 函数,函数指针等,各种的比较::

 

----std::unique_ptr除了用在工厂函数的返回类型这个场景外,另一个典型的应用是Pimpl Idiomhttps://blog.csdn.net/qq_35865125/article/details/103837518

 

----std::unique_ptr可以用来托管单个对象的指针,也可以托管一个数组,但是,一般情况下,由于std::array, std::vector

存在,一般不需要托管一个数组,,另外,不管让其托管的是啥,其是智能识别托管类型的:

 

----std::unique_ptr可以被方便地转换为shared_ptr,这也是其非常非常适合用于工厂函数的返回值

的重要原因:::!!  --        看来我需要该之前写过的工厂函数了

 

---std::unique_ptr总结:

 

 

 

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

First Snowflakes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值