C++ std::unique_ptr

在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(): 返回析构其管理对象调用的指针.

如果觉得有帮助,可以扫描右边的微信打赏码支持一下.

Leave a Reply

Your email address will not be published. Required fields are marked *