RALL设计理念
将资源和对象的生命周期绑定,对象初始化时初始化资源,对象释放时释放资源.
将资源托管给一个对象,当对象离开作用域的时候会自动调用析构函数,在析构函数里对资源进行释放.
三种智能指针介绍
C++新的标准库提供了两种智能指针的类型(智能指针本质上是一个类)来管理动态内存,shard_ptr允许多个智能指针管理一块动态内存(通过引用技术进行管理,当引用计数为0的时候,释放动态内存),而unique_ptr则独占所指向的对象.weak_ptr是一种伴随类,指向shard_ptr指向的对象.这三个指针都默认放在memory头文件下.
shard_ptr
shard_ptr是一种模板类,使用时需要传入其能指向的对象类型,
shard_ptr a;表示a能指向的对象类型是int.
shard_ptr默认指向空
在一个判断语句里使用智能指针,相当于判断该智能指针是否为空,是否指向一个对象.
shard_ptr与unique_ptr都支持的操作:
- shard_ptr sp; unique_ptrsp; //空智能指针,可以指向类型为T的对象.
- *p //获得智能指针指向的对象.
- p->men()//等价于(*p.men())
- p.get()//返回智能指针中保存的指针.
- swap(p,q);//交换智能指针p和q里面保存的指针.
- p.swap(q).
shard_ptr单独支持的操作
- make_shard(args) //拿args为参数动态分配一个T类型的对象,返回一个shard_ptr指向该对象
- shard_ptrp(q);//p是q的拷贝,该操作会递增q里面的引用计数.q中的指针类型必须能转换成T
- shard_ptr p=q;//此操作会递减p中的引用技术,如果引用计数递减为0,会释放p所指向的动态内存空间.会递增q中的引用计数.
shard_ptr的析构函数会递减它所指向对象的引用计数,当引用计数减少到0时,就会销毁对象,释放他所占有的内存.