C++ 独享智能指针 unique_ptr
unique_ptr 独享它指向的对象。也就是只有他自己同时指向同一个对象,当这个unique_ptr被销毁的时候,对象也被销毁。
包含头文件 #include <memory>
unique_ptr的模板类函数
第一个参数是指向的对象的数据类型,第二个参数是指定的删除器,一般默认是 delete;
用法
class AA {};
AA* p = new AA("xishi");
std::unique_ptr<AA> pu1(p); // 使用智能指针 pu1 管理指针 p 指向的对象
*pu1 pu1-> // 和普通指针用法一样
std::unique_ptr<AA> pu1(new AA("xishi")); // 用法二
unique_ptr 的构造函数前面加上了 explicit 关键字 说明此指针不能用于转换函数,也就是
unique_ptr<AA> pu2 = p;
unique_ptr<AA> pu3 = new AA("xishi"); // 以上都是错误的,不能把普通指针直接赋给智能指针。
他还不能使用拷贝构造函数 unique_ptr<AA> pu2 = pu1 ; // 错误
pu2 = pu1 ; // 错误 不能复制 赋值
其实就是这个智能指针只能同时一个指向对象,不然这样释放对象时其他的智能指针就内存泄漏了
std::unique_ptr<AA> pu1 = make_unique<AA> ("xishi"); // C++14标准
不要同一个裸指针初始化多个智能指针
AA* p = new AA("xishi");
std::unique_ptr<AA> pu1(p);
std::unique_ptr<AA> pu2(p); // 错误
总结 智能指针就是类 类中有一个成员 管理着裸指针
智能指针只能传引用 不能传值
其他细节
智能指针为临时变量时可以作为函数返回
使用 nullptr 给unique _ptr 赋值 将释放对象
release() 函数可以释放 unique_ptr的管理权 move() 函数可以转移 unique_ptr的管理权
reset() 函数可以释放对象
智能指针具有多态的性质
智能指针可以创建指针数组
unique_ptr<AA[]> parr2(new AA[2]);
unique_ptr<AA[]> parr2(new AA[2]{string("xishi"), string("bingbing") });
C++ 共享智能指针 shared _ptr
和上面好多都一样
但是没有删除 拷贝构造函数 和 赋值函数
三种初始化方法和上面一样:
1 shared_ptr<AA> p0(new AA("xishi"));
2 shared_ptr<AA> p0 = make_shared<AA>("xishi");
3 AA* p = new AA("xishi");
shared_ptr<AA> p0(p);
4 可以使用拷贝和赋值进行初始化
只能传引用 不能传值
C++ unique 函数
把相邻不重复的元素移动到数组前面
一般是先排序,再得到 数组的 begin() end() iterator
然后 unique();
前面的都是不重复的,unique() 返回的是指向第一个重复元素的迭代器。