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