c++中的smart pointer四个智能指针
- C++里面的四个智能指针:
auto_ptr
, shared_ptr
, weak_ptr
, unique_ptr
其中后三个是c++11支持,并且第一个已经被11弃用。
- RAII全称是“Resource Acquisition is Initialization”,直译过来是“资源获取即初始化”,也就是说在构造函数中申请分配资源,在析构函数中释放资源。
- 智能指针即RAII最具代表的实现。
#include <memory>
为什么要使用智能指针:解决内存泄漏
- 智能指针的作用是管理一个指针,因为存在以下这种情况:申请的空间在函数结束时忘记释放,造成内存泄漏。
- 使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个类,当超出了类的作用域是,类会自动调用析构函数,析构函数会自动释放资源。
- 智能指针的作用原理就是在函数结束时自动释放内存空间,不需要手动释放内存空间。
1. auto_ptr(c++98的方案,c++11已经抛弃)
auto_ptr< string> p1 (new string ("I reigned lonely as a cloud.”));
auto_ptr<string> p2;
p2 = p1;
- 此时不会报错,p2剥夺了p1的所有权,但是当程序运行时访问p1将会报错。
- 所以auto_ptr的缺点是:存在潜在的内存崩溃问题!
2. unique_ptr(替换auto_ptr)
- unique_ptr实现独占式拥有或严格拥有概念,保证同一时间内只有一个智能指针可以指向该对象。 它对于避免资源泄露(例如“以new创建对象后因为发生异常而忘记调用delete”)特别有用。
- 采用所有权模式,还是上面那个例子
unique_ptr<string> p3 (new string (