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已经释放,所有权转移了!