unique_ptr在超出作用域,即以下情况时它指向的对象会被摧毁: unique_ptr指向的对象被破坏对象通过operator=()或reset()被指定到另一个指针) unique_ptr还可能没有对象,这种情况被称为empty。 例如: std::unique_ptrp1(new int(5)); std::unique_ptrp2=p1;// 编译会出错 std::unique_ptrp3=std::move(p1);// 转移所有权,现在那块内存归p3所有, p1成为无效的针. p3.reset();//释放内存. p1.reset();//无效 不管是正常退出还是异常退出,均可通过保证删除为处理拥有动态寿命的类和函数提供额外的保护;将独有的持有动态寿命对象传递给函数;从函数获取持有动态寿命对象的所有权所有auto_ptr应该已经具有的功能 unique_ptr十分依赖于右值引用和移动语义。 下面是一段传统的会产生不安全的异常的代码: X* f() { X* p =new X; // 做一些事情 – 可能会抛出某个异常 return p; } 解决方法是,用一个unique_ptr 来管理这个对象的所有权,由其进行这个对象的删除释放工作: X* f() { unique_ptr p(new X); // 或者使用{new X},但是不能 = new X return p.release(); } 现在,如果程序执行过程中抛出了异常,unique_ptr就会(毫无疑问地)删除释放它所指向的对象,这是最基本的RAII。但是,除非我们真的需要返回一个内建的指针,我们可以返回一个unique_ptr,让事情变得更好。 unique_ptr f() { unique_ptr p(new X); // 或者使用{new X},但是不能 = new X return p; // 对象的所有权被传递出f() } 现在我们可以这样使用函数f(): void g() { unique_ptr q = f(); // 使用移动构造函数(move constructor) q->memfct(2); // 使用q X x = *q; // 复制指针q所指向的对象 // … } // 在函数退出的时候,q以及它所指向的对象都被删除释放 unique_ptr拥有“移动意义(move