智能指针:auto_ptr、share_ptr、unique_ptr

1、智能指针的原理: 智能指针以对象来管理指针,定义了类似指针的对象,通过new 来开辟内存空间,得到的地址赋给该对象。当对象生命周期结束时, 通过析构来达到资源的释放。

2、常用的智能指针: auto_ptr、 share_ptr、 unique_ptr, 智能指针的使用需要包含头文件#include<memory> 。

3、智能指针使用需要注意的问题: 

    (1)、避免删除非堆内存;

        string str("hello");

        shared_ptr<string> pstr(&str);//NO!

        pstr过期时,将delete非堆内存,错误

        (2)、避免使用new[], 即避免将数组作为其参数。因为在释放资源时不确定是使用delete ptr 还是 delete[] ptr。

4、三种智能指针实现策略:

    1).unique_ptr 与 auto_ptr

:auto_ptr和unique_ptr采用的是ownership(建立所有权)概念,对于特定对象,只能被一个智能指针所拥有,这样,只有拥有该对象的智能指针的析构函数才会删除该对象,

然后,要注意的是,赋值操作会转让操作权。 虽然auto_ptr和unique_ptr都采用该策略,但是unique_ptr的策略更严格。

当出现上述情况时,程序会编译出错,而auto_ptr则会在执行阶段core dumped。 

1、auto_ptr不能共享所有权。
2、auto_ptr不能指向数组
3、auto_ptr不能作为容器的成员。
4、不能通过赋值操作来初始化auto_ptr
std::auto_ptr<int> p(new int(42));     //OK
std::auto_ptr<int> p = new int(42);    //ERROR,本想通过new int(42)来产生临时对象temp(问题出在这里),再由temp拷贝构造产生p。
这是因为auto_ptr 的构造函数被定义为了explicit

std::auto_ptr<int> p = auto_ptr<int>(new int(42)); //Success   

5、不要把auto_ptr放入容器。

2) shared_ptr则采用reference counting(引用计数)的策略,例如,赋值时,计数+1,指针过期时,计数-1.

只有当计数为0时,即最后一个指针过期时,才会被析构掉.

1. shared_ptr是Boost库所提供的一个智能指针的实现,shared_ptr就是为了解决auto_ptr在对象所有权上的局限性(auto_ptr是独占的),在使用引用计数的机制上提供了可以共享所有权的智能指针.

2. shared_ptr比auto_ptr更安全。

3. shared_ptr是可以拷贝和赋值的,拷贝行为也是等价的,并且可以被比较,这意味这它可被放入标准库的一般容器(vector,list)和关联容器中(map)。

智能指针的选择:

(1)当多个对象指向同一个对象的指针时,应选择shared_ptr 
(2)用new申请的内存,返回指向这块内存的指针时,选择unique_ptr就不错 
(3)在满足unique_ptr要求的条件时,前提是没有不明确的赋值,也可以使用auto_ptr 
(4)如上述代码所示,unique_ptr为右值(不准确的说类似无法寻址)时,可以赋给shared_ptr


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值