vector系列--vector<unique_ptr<;;初始化(所有权转移)
Posted noticeable
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vector系列--vector<unique_ptr<;;初始化(所有权转移)相关的知识,希望对你有一定的参考价值。
C++11为我们提供了智能指针,给我们带来了很多便利的地方。
那么如果把unique_ptr作为vector容器的元素呢?
形式如出一辙:vector<unique_ptr<int> > vec;
但是怎么给vec添加元素呢?
看下面:
#include<iostream> #include<vector> #include <memory> using namespace std; int main() { vector<unique_ptr<int>> vec; vec.push_back(1);//错误 return 0; }
那么先定义一个unique_ptr,再进行push_back():
#include<iostream> #include<vector> #include <memory> using namespace std; int main() { vector<unique_ptr<int>> vec; unique_ptr<int> sp(new int(126)); vec.push_back(sp);//尝试引用已删除的函数 return 0; }
这就是unique智能指针的所有权问题,这个时候就需要使用std::move:
#include<iostream> #include<vector> #include <memory> using namespace std; int main() { vector<unique_ptr<int>> vec; unique_ptr<int> sp(new int(126)); //vec.push_back(1); vec.push_back(std::move(sp));//尝试引用已删除的函数 cout << *vec[0]<< endl; // 输出126 //cout << *sp << endl; return 0; }
但是此时,上面代码的sp编程了什么呢? 使用*取值看一下,结果程序崩溃,原因何在?
就是此时sp已经释放,所有权转移了!
以上是关于vector系列--vector<unique_ptr<;;初始化(所有权转移)的主要内容,如果未能解决你的问题,请参考以下文章
vector<unique_ptr> 的初始化失败并出现复制错误