C++ unique_ptr 使用方法

792 阅读2分钟

unique_ptr是C++11引入的智能指针,用于管理动态分配的对象。它提供了一种自动删除所拥有的对象的机制,能够避免内存泄漏和资源泄漏的问题。下面是unique_ptr的使用方法:

  1. 创建unique_ptr对象:

    std::unique_ptr<int> ptr(new int(10));
    

    在创建unique_ptr对象时,需要传入一个指向动态分配对象的指针。unique_ptr会接管该指针的所有权,并在其生命周期结束时自动删除所拥有的对象。

  2. 使用unique_ptr对象:

    *ptr = 20; // 通过解引用操作符访问所拥有的对象
    int value = *ptr; // 获取所拥有的对象的值
    

    可以通过解引用操作符*来访问unique_ptr所拥有的对象,也可以直接将unique_ptr对象当作指针使用。

  3. 释放unique_ptr对象所拥有的对象:

    ptr.reset(); // 释放所拥有的对象
    

    可以调用reset()函数来释放unique_ptr对象所拥有的对象。在释放对象之后,unique_ptr对象将不再拥有任何对象。

  4. 转移unique_ptr对象的所有权:

    std::unique_ptr<int> ptr1(new int(10));
    std::unique_ptr<int> ptr2 = std::move(ptr1); // 转移ptr1的所有权给ptr2
    

    可以使用std::move()函数将unique_ptr对象的所有权转移到另一个unique_ptr对象。转移所有权后,原来的unique_ptr对象将不再拥有任何对象。

  5. 使用自定义删除器:

    struct Deleter {
        void operator()(int* p) {
            delete p;
        }
    };
    
    std::unique_ptr<int, Deleter> ptr(new int(10));
    

    可以通过指定自定义删除器来管理unique_ptr对象所拥有的对象的释放方式。自定义删除器是一个函数对象,可以重载函数调用操作符operator()来定义对象的释放方式。

需要注意的是,unique_ptr对象不能进行复制操作,只能进行移动操作。这是因为unique_ptr的设计初衷是为了管理独占的资源,不允许多个unique_ptr对象同时拥有同一个对象。如果需要共享所有权,可以使用shared_ptr。此外,unique_ptr还提供了一些其他的成员函数和操作符,如get()、release()、operator bool()等,可以根据需要进行使用。

综上所述,unique_ptr是一种非常方便的智能指针,可以有效地管理动态分配的对象,避免内存泄漏和资源泄漏的问题。