C++ 动态内存管理: `std::unique_ptr

定义与头文件

std::unique_ptr 的功能定义于 <memory> 头文件中。它主要用于管理动态分配的内存,保证资源正确释放。

函数模板 std::make_unique

非数组类型

template< class T, class... Args >
unique_ptr<T> make_unique( Args&&... args );
  • C++14 起
  • 用于构造非数组类型 T 的对象。参数 args 被转发给 T 的构造函数。
  • 重载仅参与非数组类型的重载决议。
  • 函数等价于 unique_ptr<T>(new T(std::forward<Args>(args)...))

未知边界数组

template< class T >
unique_ptr<T> make_unique( std::size_t size );
  • C++14 起
  • 用于构造未知边界的 T 数组。
  • 重载仅参与未知边界数组的重载决议。
  • 函数等价于 unique_ptr<T>(new typename std::remove_extent<T>::type[size]())

已知边界数组

template< class T, class... Args >
/* unspecified */ make_unique( Args&&... args ) = delete;
  • C++14 起
  • 不允许构造已知边界的数组。

函数模板 std::make_unique_for_overwrite

非数组类型

template< class T >
unique_ptr<T> make_unique_for_overwrite();
  • C++20 起
  • 用于默认初始化非数组类型 T 的对象。
  • 重载仅参与非数组类型的重载决议。
  • 函数等价于 unique_ptr<T>(new T)

未知边界数组

template< class T >
unique_ptr<T> make_unique_for_overwrite( std::size_t size );
  • C++20 起
  • 用于默认初始化未知边界的 T 数组。
  • 重载仅参与未知边界数组的重载决议。
  • 函数等价于 unique_ptr<T>(new typename std::remove_extent<T>::type[size])

已知边界数组

template< class T, class... Args >
/* unspecified */ make_unique_for_overwrite( Args&&... args ) = delete;
  • C++20 起
  • 不允许构造已知边界的数组。

返回值与异常

返回 std::unique_ptr 管理的 T 类型实例。可能抛出 std::bad_alloc 或任何 T 构造函数可能抛出的异常。若抛出异常,则此函数无效果。

示例

#include <iostream>
#include <memory>

struct Vec3 {
    int x, y, z;
    Vec3(int x = 0, int y = 0, int z = 0) noexcept : x(x), y(y), z(z) {}
    friend std::ostream& operator<<(std::ostream& os, const Vec3& v) {
        return os << '{' << "x:" << v.x << " y:" << v.y << " z:" << v.z  << '}';
    }
};

int main() {
    std::unique_ptr<Vec3> v1 = std::make_unique<Vec3>();
    std::unique_ptr<Vec3> v2 = std::make_unique<Vec3>(0, 1, 2);
    std::unique_ptr<Vec3[]> v3 = std::make_unique<Vec3[]>(5);

    std::cout << "make_unique<Vec3>():      " << *v1 << '\n'
              << "make_unique<Vec3>(0,1,2): " << *v2 << '\n'
              << "make_unique<Vec3[]>(5):   " << '\n';
    for (int i = 0; i < 5; i++) {
        std::cout << "     " << v3[i] << '\n';
    }
}

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
std::unique_ptrC++11引入的智能指针,用于管理动态内存的生命周期。它提供了一种安全且方便的方式来分配和释放动态内存,避免了手动管理内存的繁琐和容易出错的问题。 要使用std::unique_ptr来开辟动态内存,可以按照以下步骤进行: 1. 包含头文件:首先需要包含<memory>头文件,因为std::unique_ptr是在该头文件中定义的。 2. 创建std::unique_ptr对象:使用std::unique_ptr来管理动态内存,需要创建一个std::unique_ptr对象,并将其初始化为指向动态内存的指针。例如: ```cpp std::unique_ptr<int> ptr(new int); ``` 这里创建了一个std::unique_ptr对象ptr,并将其初始化为指向一个int类型的动态内存。 3. 使用std::unique_ptr对象:可以像使用原始指针一样使用std::unique_ptr对象。例如,可以通过解引用操作符*来访问动态内存中的值,也可以使用箭头操作符->来访问动态内存中的成员。例如: ```cpp *ptr = 10; std::cout << *ptr << std::endl; ``` 这里将动态内存中的值设置为10,并输出该值。 4. 自动释放内存:当std::unique_ptr对象超出其作用域时,会自动释放所管理的动态内存。这意味着不需要手动调用delete来释放内存,从而避免了内存泄漏和悬空指针的问题。 总结一下,使用std::unique_ptr开辟动态内存的步骤是:包含头文件、创建std::unique_ptr对象并初始化为指向动态内存的指针、使用std::unique_ptr对象操作动态内存、自动释放内存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值