声明:本文内容生成自ChatGPT,目的是为方便大家了解学习作为引用到作者的其他文章中。
std::make_unique
是 C++14 引入的一个函数模板,用于创建类型为 std::unique_ptr
的智能指针。智能指针用于管理动态分配的对象,在其生命周期结束时自动释放资源,避免手动调用 delete
来管理内存。std::make_unique
提供了一种安全、简洁的方式来创建 std::unique_ptr
,并避免使用 new
关键字。
std::make_unique
的优势
- 安全性 :相比直接使用
new
,std::make_unique
可以防止内存泄漏。因为在异常抛出时,即使构造函数抛出异常,内存也会安全释放。 - 简洁性 :使用
std::make_unique
可以减少代码量,使代码更简洁,不需要手动调用new
或delete
。 - 高效性 :它直接构造对象并将其交给
std::unique_ptr
,避免了额外的赋值操作。
语法
cpp
std::unique_ptr<T> ptr = std::make_unique<T>(constructor_args);
T
是你想创建的对象的类型。constructor_args
是传递给T
构造函数的参数。
示例
1. 创建单个对象
cpp
#include <iostream>
#include <memory>
struct MyClass {
MyClass(int x) : value(x) {
std::cout << "MyClass constructor, value: " << value << std::endl;
}
~MyClass() {
std::cout << "MyClass destructor" << std::endl;
}
int value;
};
int main() {
// 使用 std::make_unique 创建 std::unique_ptr
std::unique_ptr<MyClass> ptr = std::make_unique<MyClass>(10);
std::cout << "Value: " << ptr->value << std::endl; // 访问成员变量
return 0; // 在这里 ptr 会自动销毁,调用析构函数
}
输出:
vbnet
MyClass constructor, value: 10
Value: 10
MyClass destructor
在这个例子中,我们使用 std::make_unique
创建了一个指向 MyClass
对象的 std::unique_ptr
。当 ptr
退出作用域时,std::unique_ptr
会自动调用对象的析构函数并释放内存。
2. 创建数组
对于动态分配数组的情况,也可以使用 std::make_unique
,不过需要显式指定数组类型。
cpp
#include <iostream>
#include <memory>
int main() {
// 使用 std::make_unique 创建一个动态分配的数组
std::unique_ptr<int[]> arr = std::make_unique<int[]>(5);
for (int i = 0; i < 5; ++i) {
arr[i] = i * 10;
}
for (int i = 0; i < 5; ++i) {
std::cout << "arr[" << i << "] = " << arr[i] << std::endl;
}
// 在这里,arr 自动销毁并释放内存
return 0;
}
输出:
css
arr[0] = 0
arr[1] = 10
arr[2] = 20
arr[3] = 30
arr[4] = 40
std::make_unique<int[]>
创建了一个长度为 5 的 int
数组,并通过 std::unique_ptr
自动管理它的生命周期。
使用 std::unique_ptr
的注意事项
-
独占所有权 :
std::unique_ptr
是独占所有权的智能指针,意味着它不能被复制。如果你尝试复制一个std::unique_ptr
,编译器会报错。cppstd::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>(10); std::unique_ptr<MyClass> ptr2 = ptr1; // 错误,无法复制 unique_ptr
但是,可以通过
std::move
来转移所有权:cppstd::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>(10); std::unique_ptr<MyClass> ptr2 = std::move(ptr1); // 转移所有权
-
自动释放资源 :当
std::unique_ptr
超出作用域时,自动调用delete
,不需要手动管理资源释放。
总结
std::make_unique
提供了一种更简洁和安全的方式来创建std::unique_ptr
,避免了手动管理内存的麻烦。std::unique_ptr
提供独占的所有权,确保对象在不再使用时自动释放资源。- 使用
std::make_unique
可以减少使用new
和delete
时的出错风险。