孤独,是忧愁的伴侣,也是精神活动的密友。——(黎)纪伯伦
智能指针就是一种代理模式,代理裸指针,帮助用户管理堆内存。 (倒是与标准库中的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 Idiom,https://blog.csdn.net/qq_35865125/article/details/103837518
----std::unique_ptr可以用来托管单个对象的指针,也可以托管一个数组,但是,一般情况下,由于std::array, std::vector
存在,一般不需要托管一个数组,,另外,不管让其托管的是啥,其是智能识别托管类型的:
----std::unique_ptr可以被方便地转换为shared_ptr,这也是其非常非常适合用于工厂函数的返回值
的重要原因:::!! -- 看来我需要该之前写过的工厂函数了
---std::unique_ptr总结: