1. 程式人生 > >實戰c++中的vector系列--vector<unique_ptr<>>初始化(全部權轉移)

實戰c++中的vector系列--vector<unique_ptr<>>初始化(全部權轉移)

down pop namespace tor each ring space spa hid

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已經釋放,全部權轉移了!

實戰c++中的vector系列--vector&lt;unique_ptr&lt;&gt;&gt;初始化(全部權轉移)