unique_ptr概述
uniue_ptr是一个独占式的指针,同一个时刻, 就只能有一个unique_ptr指向这个对象(内存),unique_ptr的使用格式
unique_ptr<Class_Tyep> P_Name;
unique_ptr的常规初始化:
unique_ptr<int> p; 创建一个空的智能指针
unique_ptr<int> pi(new int);
- make_unique函数
make_unique函数是在C++14中引入的,使用了make_unique函数之后不能指定删除器, 如果不需要使用删除器, 尽量使用make_unique函数,他的效率高
unique_ptr<int> p = make_unique<int>(100);
auto p2 = make_unique<string>("C++");
unique_ptr常用操作
- unique_ptr的初始化和赋值
unique_ptr<int> p1 = make_unique<int>(100);
unique_ptr<int> p2(new int(200));
// unique_ptr<int> p3(p1); 不支持定义时初始化
// p1 = p2; 不支持赋值操作
// 支持移动语义
unique_ptr<int> p3 = std::move(p2); // 移动过后, p2为空, p3指向原来p2指向的对象.
- release
release(): 放弃对指针的控制权, 切断了智能指针和其所指向的对象的联系
他会返回一个裸指针, 可以将返回的这个裸指针手工delete释放, 也可以用来初始化另外一个智能指针.
unique_ptr<int> p1(new int(100));
unique_ptr<int> p2(p1.release());
// delete p1.release();
if (p1 == nullptr) cout << "ha ha" << endl;
cout << *p2 << endl;
- reset()
reset不带参数: 释放智能指针指向的对象, 将智能指针置空
unique_ptr<string> pstr(new string("C++"));
pstr.reset();
if (pstr == nullptr) cout << "指针为空" << endl;
reset带参数, 释放智能指针指向的对象, 并让该智能指针指向新的对象
unique_ptr<string> pstr(new string("C++"));
//pstr.reset();
//if (pstr == nullptr) cout << "指针为空" << endl;
unique_ptr<string> pstr1(new string("Java"));
pstr.reset(pstr1.release());
cout << *pstr << endl;
- = nullptr
= nullptr释放智能指针指向的对象, 并将智能指针置空
unique_ptr<int> ps1(new int(200));
ps1 = nullptr;
- 指向一个数组
unique_ptr<int[]> p(new int[10]());