定义与头文件
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';
}
}