unique_ptr的相关使用

unique_ptr

unique_ptr由C++11中引入,用于替代不安全的auto_ptr
unique_ptr是一种定义在< memory >中的只能指针

它持有对对象的独有权

  • 两个unique_ptr不能指向同一个对象,即unique_ptr不共享它的所管理的对象。
  • 它无法复制其他unique_ptr;
  • 无法通过值传递到函数;
  • 也无法用于需要副本的任何标准模板库 (STL)算法。
  • 只能移动 unique_ptr,即对资源管理权限可以实现转移。

这意味着,内存资源所有权可以转移到另外一个unique_ptr,并且原始的unique_ptr不再拥有次资源

实际使用中,建议将对象限制为由一个所有者所有,因为多个所有权会使程序逻辑变得复杂。因此,当需要智能指针用于纯 C++ 对象时,可使用 unique_ptr,而当构造 unique_ptr 时,可使用 make_unique Helper 函数。

unique_ptr与原始指针一样有效,并可用于 STL 容器。将 unique_ptr 实例添加到 STL 容器运行效率很高,因为通过 unique_ptr 的移动构造函数,不再需要进行复制操作。

unique_ptr指针与其所指对象的关系:

  • 在智能指针生命周期内,可以改变智能指针所指对象,如创建智能指针时通过构造函数指定、通过reset方法重新指定、通过release方法释放所有权、通过移动语义转移所有权,unique_ptr还可能没有对象,这种情况被称为empty。
#include 
#include 

int main() {
    {
        std::unique_ptr<int> uptr(new int(10));  //绑定动态对象
        //std::unique_ptr uptr2 = uptr;  //不能賦值
        //std::unique_ptr uptr2(uptr);  //不能拷内
        std::unique_ptr<int> uptr2 = std::move(uptr); //轉換所有權
        uptr2.release(); //释放所有权
    }
    //超过uptr的作用域,内存释放
}

unique_ptr指针本身的生命周期:从unique_ptr指针创建时开始,直到离开作用域。离开作用域时,若其指向对象,则将其所指对象销毁(默认使用delete操作符,用户可指定其他操作)。unique_ptr指针与其所指对象的关系:在智能指针生命周期内,可以改变智能指针所指对象,如创建智能指针时通过构造函数指定、通过reset方法重新指定、通过release方法释放所有权、通过移动语义转移所有权。

参考文章:
C++11中智能指针的原理、使用、实现
STL四种智能指针

你可能感兴趣的:(Interview,Preparation,C/C++,Self-Culture,Piecemeal,Knowledge)