【C++】:shared_ptr和unique_ptr

智能指针的行为类似常规指针,重要的区别是它负责自动释放所指向的对象。

  • std::unique_ptr:独占资源所有权的指针。
  • std::shared_ptr:共享资源所有权的指针。

1 std::unique_ptr

当我们独占资源的所有权的时候,可以使用std::unique_ptr对资源进行管理,一旦离开unique_ptr对象的作用域时,会自动释放资源。

    //初始化unique_ptr必须采用直接初始化形式
    std::unique_ptr p1;              //可以指向一个int的unique_ptr
    std::unique_ptr p2(new int(10)); //指向一个值为10的int
    std::cout << "p1:" << p1.get() << endl;
    std::cout << "p2:" << p2.get() << endl;

    // unique_ptr不支持普通的拷贝或赋值操作
    // p1 = p2;                     //编译报错
    // std::unique_ptr p3(p2); //编译报错

    //虽然我们不能拷贝或赋值unique_ptr,
    //但是可以通过调用release或reset将指针的所有权从一个unique_ptr转移到另一个unique_ptr
    p1.reset(p2.release());                // reset接受一个可选的指针参数,令unique_ptr重新指向给定的指针.
    std::unique_ptr p3(p2.release()); // release返回unique_ptr当前保存的指针并将其置为空.
    std::cout << "p3:" << p3.get() << endl;
    std::cout << "p1:" << p1.get() << endl;
    std::cout << "p2:" << p2.get() << endl;

2 std::shared_ptr

    //最安全的分配和使用动态内存的方法是调用一个名为make_shared的标准库函数.
    std::shared_ptr p1;
    std::shared_ptr p2(new string("hello world"));
    std::shared_ptr p3 = std::make_shared("hello world");

    // shared_ptr的拷贝和赋值
    //当进行拷贝和赋值操作时,每个shared_ptr都会记录有多少个其他shared_ptr指向相同的对象
    std::shared_ptr p4 = p3; // p3和p4指向相同对象,此对象有两个引用者
    std::cout << "p4.unique():" << p4.unique() << endl;//0
    std::cout << "p4.use_count():" << p4.use_count() << endl;//2

你可能感兴趣的:(C/C++,shared_ptr,unique_ptr)