class UNP
{
public:
UNP(int ii)
{
i = ii;
cout<<"constructor:"<<i<<endl;
}
~UNP()
{
cout<<"destructor:"<<i<<endl;
}
private:
int i;
};
std::unique_ptr<UNP> uniptr()
{
//unique_ptr构造
unique_ptr<int> u_i10;
u_i10.reset(new int(10)); //方法1:先设空,再reset
unique_ptr<int> u_i11(new int(11)); //方法2:直接赋值构造
UNP* k = new UNP(2);
std::unique_ptr<UNP> u_i2(k); //方法3:普通指针构造,直接管理k
unique_ptr<UNP> u_i1(new UNP(1));
u_i1.reset(u_i2.release()); //方法4,用另一个unique_ptr构造,u_i原来指向的对象UNP(1)现在会析构,u_i1帮u_i2管理,
// u_i2变成空, 注意u_i2.release()会使u_i2变成空。
unique_ptr<UNP> u_i3(new UNP(3));
u_i3 = std::move(u_i1); //方法5,所有权转移(通过移动语义),同方法4,UNP3会析构,u_i3帮u_i1管理,u_i1变成空
return u_i3;
// int *p_i = u_i2.release(); //释放所有权,u_i2变成空
// unique_ptr<string> u_s(new string("abc"));
// unique_ptr<string> u_s2 = std::move(u_s); //所有权转移(通过移动语义),u_s所有权转移后,变成“空指针”
// u_s2=nullptr;//显式销毁所指对象,同时智能指针变为空指针。与u_s2.reset()等价
}
int main()
{
unique_ptr<UNP> a = std::move(uniptr());
a = nullptr; //UNP(2)已析构,不需等到main完结,显式销毁所指对象,同时智能指针变为空指针。与a.reset(),a.release()等价
return 0;
}
原文:http://mingtangduyao.blog.51cto.com/4876371/1623417