智能指针
auto_ptr, shared_ptr, weak_ptr, unique_ptr 后三个是c++11支持的 包含在<memory头文件中
智能指针指的是一个类,当运行空间超出了此类的作用域的时候,会自动调用析构函数,自动释放资源。很大程度上可以避免内存泄漏。
shared_ptr
shared_ptr多个指针指向相同的对象。shared_ptr中使用引用计数来标记有多少shared_ptr类型指针指向的是同一块内存。每发生拷贝一次,引用计数就会加1,每析构一次,引用计数就会减1,当减为0的时候,自动删除所指向的内存。
- 初始化:智能指针是个类模板,它可以指定类型,传入指针通过构造函数初始化,也可以使用make_share函数来初始化。不能将指针直接复制给一个智能指针。
- 拷贝和复制:拷贝会使得引用计数加1,而赋值会使得目标智能指针的原对象引用计数减1。
- 通过Get函数获取原始指针
- 不要用一个原始指针来初始化多个shared_ptr,这样做会造成内存的二次释放
- 不要循环引用,这是shared_ptr最大的一个缺点,循环引用会使得内存无法被正确释放,造成内存泄漏
unique_ptr
unique_ptr是唯一拥有所指对象,同一个时刻只能有一个unique_ptr指向给定的对象(通过禁止拷贝赋值、只有移动语义来实现的)。当出现异常的时候,动态资源能得到正确的释放。unique_ptr的生存周期是当前作用域。在unique_ptr的生命周期内,可以改变unique_ptr所指的对象,通过move 转换所有权,reset重新指定,release重新释放所有权。
weak_ptr
weak_ptr是为了配合shared_ptr而引入的一种智能指针,他最大的作用是协助shared_ptr来工作,像旁观者一样来观测资源情况。weak_ptr可以从一个shared_ptr 或者weak_ptr对象构造,获得资源的观测权。但是weak_ptr没有共享资源,不会增加资源的引用计数。weak_ptr 中的expired 是判断是否观测对象销毁,返回true,代表引用计数为0。lock方法会当weak_ptr所代表的对象存在时,返回可操作的代表对象,会使引用计数加1,若对象不存在,则返回一个控指针。

浙公网安备 33010602011771号