目的
- 一块内存只能一个独占智能指针管理
- 其他都与shared_ptr类似
表示方式
- unique_ptr的初始化
//构造函数初始化
unique_ptr<int> ptr1(new int(10));
//移动初始化
unique_ptr<int> ptr2 = move(ptr1);
//函数返回值(将亡值)初始化
unique_ptr<int> ptr3 = init();
//reset初始化
ptr3.reset(new int(250));
- unique_ptr的使用
//获取原始指针,通过get()方法获取地址,*获取值
unique_ptr<Test> class_ptr2(new Test);
Test* t = class_ptr2.get();//get()智能指针的成员函数,通过.获取
t->setValue(25);
t->display();
//直接通过智能指针访问
class_ptr2->setValue(44);//指针方式->获取
class_ptr2->display();
- unique_ptr的删除器
unique_ptr<Test[]> ptr4(new Test[3]);
细节
- unique_ptr是引用计数最大为1的share_ptr,很多操作都类似
- unique_ptr初始化只能通过移动语义赋值,原因就是资源是独占的,不能赋值
- C++11后,unique_ptr和shared_ptr的删除器均支持数组地址的释放
举例
#include <bits/stdc++.h>
using namespace std;
class Test
{
public:
Test()
{
cout << "construct Test..." << endl;
}
Test(int x)
{
cout << "construct Test, x = " << x << endl;
}
Test(string str)
{
cout << "construct Test, str = " << str << endl;
}
~Test()
{
cout << "destruct Test ..." << endl;
}
void setValue(int v){
m_num = v;
}
void display(){
cout << "成员变量m_num:" << m_num << endl;
}
private:
int m_num;
};
unique_ptr<int> init(){
return unique_ptr<int>(new int(22));//函数返回独占指针,此时该指针的生命周期即将被析构,它对资源的所有权将要消失,因此可以赋值给其他独占指针
}
int main(){
cout << "----------------独占智能指针的初始化-----------------" << endl;
//构造函数初始化
unique_ptr<int> ptr1(new int(10));
// unique_ptr<int> ptr2 = ptr1;//error,独占智能指针不能通过赋值方式,因为是独占的
cout << "ptr1的值:" << *ptr1 << endl;
//移动初始化
unique_ptr<int> ptr2 = move(ptr1);
cout << "移动初始化,ptr2的值:" << *ptr2 << endl;
//函数返回值(将亡值)初始化
unique_ptr<int> ptr3 = init();
cout << "函数返回值初始化,ptr3的值:" << *ptr3 << endl;
//reset初始化
ptr3.reset(new int(250));
cout << "reset()初始化,ptr3的值:" << *ptr3 << endl;
cout << "----------------独占智能指针的使用,与shared_ptr相同-----------------" << endl;
//获取原始指针,通过get()方法获取地址,*获取值
unique_ptr<Test> class_ptr2(new Test);
Test* t = class_ptr2.get();//get()智能指针的成员函数,通过.获取
t->setValue(25);
t->display();
//直接通过智能指针访问
class_ptr2->setValue(44);//指针方式->获取
class_ptr2->display();
cout << "----------------独占智能指针,共享智能指针的删除器-----------------" << endl;
//c++11之后,独占智能指针,共享智能指针的删除器是可以管理数组的地址的
// unique_ptr<Test[]> ptr4(new Test[3]);
shared_ptr<Test[]> ptr5(new Test[3]);
// system("pause");
return 0;
}
运行结果
参考学习
https://www.bilibili.com/video/BV1bX4y1G7ks