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