C++笔记 - std::unique_ptr

1,318 阅读1分钟

在C++中使用智能指针能有效避免空指针和悬垂指针出现,使用智能指针也能减少心智负担。下面将讲解一下std::unique_ptr智能指针。该智能指针用于处理只有一个实例拥有所有权的情况,可以通过所有权转移的方式移交资源。下面看一下它的使用方法:

#include <iostream>
#include <memory>
#include <cassert>

class Any {
  public:
    friend std::ostream &operator<<(std::ostream &out, const Any &a);
};

std::ostream &operator<<(std::ostream &out, const Any &a) {
    out << "I am Any";
    return out;
}

int main(void) {
    std::unique_ptr<Any> a{new Any};
    std::cout << *a << std::endl;

    std::unique_ptr<Any> a2; // 初始化为nullptr

    // a2 = a; // 非法,不允许左值赋值
    a2 = std::move(a);
    assert(a == nullptr);
    assert(a2 != nullptr);

    // C++14 可以使用 make_unique函数
    auto a3 = std::make_unique<Any>();
    std::cout << *a3 << std::endl;

    // 创建一个包含实例的数组
    auto a4 = std::make_unique<Any[]>(2);
    std::cout << a4[0] << std::endl;
    std::cout << a4[1] << std::endl;
    return 0;
}

默认使用newdelete来分配和释放内存,也可以修改该行为。下面看一个例子:

template <typename T> auto dealloc = [](T *p) { free(p); };

int main(void) {
    int *p = (int *)malloc(sizeof(int));
    *p = 1;
    std::unique_ptr<int, decltype(dealloc<int>)> ptr{p, dealloc<int>};
    std::cout << *ptr << std::endl; // 输出: 1
}

常用方法:

  • release():返回该对象的管理的指针,同时释放所有权。
  • reset():释放管理的内存,同时也可以传递一个新对象的指针对象
  • swap():交换所管理的对象。
  • get():返回对象管理的指针。
  • get_deleter():返回析构其管理对象调用的指针。