1、shared_ptr 共享的智能指针
1)shared_ptr 使用引用计数,每一个shared_ptr 的拷贝都指向相同的内存。在最后一个shared_ptr析构的时候,内存才会被释放。
2)不能将一个原始指针直接赋值给一个智能指针。错误写法:shared_ptr<int> p = new int(5); 正确写法:shared_ptr<int> p(new int(5)) ;
3)shared_ptr 默认的删除不支持数组对象,所以用shared_ptr 管理动态数组时,需要指定删除器。shared_ptr<int> pArray(new int[10], [](int * p){delete[] p;});
也可以使用默认的删除器 shared_ptr<int> pArray(new int[10], default_delete<int[]>);
4)不要用一个原始指针初始化多个shared_ptr;不要在函数实参中创建shared_ptr。
2、unique_ptr 独占的智能指针
1)不允许通过赋值将一个unique_pt 赋值给另一个unique_ptr,不允许其他的智能指针共享其内部的指针。
2)可以通过函数返回给其他的unique_ptr,可以通过std:move来转移到其他的unique_ptr
3)c++14提供make_unique来创建unique_ptr。
4)unique_ptr 可以指向一个数组。 unique_ptr<int []> ptr(new int[10]); ptr[9] = 9;
5)unique_ptr 在指定删除器的时候需要确定删除器的类型。
3、weak_ptr 弱引用的智能指针
1)weak_ptr 主要是为了监视shared_ptr的生命周期,它的构造不会增加引用计数,它的析构也不会减少引用计数。纯粹只是作为一个旁观者监视shared_ptr中管理的资源是否存在。
2)通过use_count()方法获得当前观察资源的引用计数;通过expired()方法判断所观测的资源是否已经被释放;通过lock方法获取所监视的shared_ptr。