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; //成功
}