unique

it2026-06-04  5

unique_ptr智能指针

与shared_ptr不同,unique_ptr没有定义类似make_shared的操作,因此只可以使用new来分配内存,而且由于unique_ptr不可以进行拷贝和赋值操作,初始化unique_ptr必须使用直接初始化的方式。 unique_ptr<int> a(new int()); //成功,直接初始化 unique_ptr<int> b=new int(); //失败! 构造函数是explicit unique_ptr<int> c(a); //失败! 不允许拷贝

可以进行移动构造和移动赋值操作,在函数中做为返回值使用 

unique_ptr<int> print( ){ unique_ptr<int> a(new int(10)); return a;//局部变量 } unique_ptr<int> b=print(); //运行成功

或者

unique_ptr<int> print( ){ return unique_ptr<int> (new int(10));//返回自身 } unique_ptr<int> b=print(); //运行成功

 

上面的操作有些类似move的做法, 

unique_ptr<int> a(new int(10)); unique_ptr<int> b=std:move(a) ; //这里是显式的所有权转移,把a所指的内存转给b了,而a不再拥有该内存

unique_ptr做为STL容器的元素时,不能直接进行传递,因为不可以进行拷贝和赋值操作.

vector<unique_ptr<int>> a; a.push_back(new int(20)); //错误 a.emplace_back(new int(20)); //错误 a.emplace_back(make_unique<int>(20)); //错误

但可以通过move函数转换权限从而实现 ,

unique_ptr<int> a(new int(20)); vector<unique_ptr<int>> b; b.push_back(std::move(a)); //正确

有一点值得注意的是:

 unique_ptr做为STL容器的元素时,不能作为类的成员变量,

class a{ //省略 } class b{ private: vector<unique_ptr<int>> temp; //错误 vector<unique_ptr<a>> tmp; //错误 }

share_ptr智能指针 

可以实现拷贝和赋值,所以上面出现的错误都能运行。

vector<shared_ptr<int>> a; a.push_back(new int(20)); //成功 a.emplace_back(new int(20)); //成功 a.emplace_back(make_unique<int>(20)); //成功 class a{ //省略 } class b{ private: vector<shared_ptr<int>> temp; //成功 vector<shared_ptr<a>> tmp; //成功 }

 

 

最新回复(0)