C++11之智能指针unique_ptr

发布时间 2023-06-16 00:01:28作者: TechNomad

std::unique_ptr 是 C++ 标准库中的智能指针类,用于管理动态分配的对象。它提供了独占式拥有权,即在任何时候只能有一个 std::unique_ptr 拥有对对象的唯一所有权。当 std::unique_ptr 被销毁或重置时,它会自动删除所管理的对象,从而避免内存泄漏。

std::unique_ptr 的主要特点和用法如下:

  1. 独占式所有权:一个 std::unique_ptr 实例拥有对对象的唯一所有权,不能拷贝或共享所有权。这意味着只能有一个 std::unique_ptr 实例指向同一个对象,从而避免了资源的多重释放和访问冲突。

  2. 托管动态分配的对象:std::unique_ptr 主要用于托管通过 newstd::make_unique 动态分配的对象。它可以管理任何可删除的对象,包括基本类型、自定义类型和数组等。

  3. 自动释放资源:当 std::unique_ptr 被销毁或重置时,它会自动调用所管理对象的析构函数,并释放对象所占用的内存。这消除了手动管理资源释放的需求,提高了代码的可靠性和安全性。

  4. 移动语义:std::unique_ptr 支持移动语义,可以通过移动构造函数和移动赋值运算符将所有权从一个 std::unique_ptr 实例转移给另一个实例,从而避免不必要的对象拷贝和资源释放。

一、unique_ptr初始化

#include <iostream>
#include <memory>

class UniquePtr {
public:
    UniquePtr() { std::cout << "调用构造函数" << std::endl; }
    ~UniquePtr() { std::cout << "调用析构函数" << std::endl; }
    void print() { std::cout << "调用print()函数" << std::endl; }
};

int main() {
    std::unique_ptr<UniquePtr> ptr(new UniquePtr());
    ptr->print();

    return 0;
}

二、无法进行复制构造和赋值操作

int main() {
    std::unique_ptr<UniquePtr> ptr(new UniquePtr());
    std::unique_ptr<UniquePtr> ptr1(ptr); //报错
    std::unique_ptr<UniquePtr> ptr2 = ptr; //报错
   
    return 0;
}

三、可以进行移动构造和移动赋值操作

unique_ptr虽然没有拷贝和赋值操作,但却提供了一种移动机制来将指针的所有权从一个unique_ptr转移给另一个unique_ptr。如果需要转移所有权,可以使用std::move()函数。

int main() {
    std::unique_ptr<UniquePtr> ptr(new UniquePtr());
    std::unique_ptr<UniquePtr> ptr2 = std::move(ptr); //转移所有权
    std::unique_ptr<UniquePtr> ptr3(std::move(ptr));
   
    return 0;
}

四、可以通过函数返回值返回unique_ptr

#include <iostream>
#include <memory>

class UniquePtr {
public:
    UniquePtr() { std::cout << "调用构造函数" << std::endl; }
    ~UniquePtr() { std::cout << "调用析构函数" << std::endl; }
    void print() { std::cout << "调用print()函数" << std::endl; }
};

std::unique_ptr<UniquePtr> return_unique_ptr() {
    std::unique_ptr<UniquePtr> ptr(new UniquePtr());

    return ptr;
}

int main() {
    std::unique_ptr<UniquePtr> ptr = return_unique_ptr();
   
    return 0;
}