`std::unique_ptr` 是 C++11 引入的智能指针,用于管理动态分配的对象的生命周期。`unique_ptr` 确保每个动态分配的对象有且仅有一个所有者,当 `unique_ptr` 超出作用域时,它会自动释放其管理的对象。以下是 `std::unique_ptr` 的一些常见初始化方法。
### 1. 使用 `std::make_unique`
`std::make_unique` 是 C++14 中引入的函数,提供了一种安全的方式来创建 `unique_ptr`。它会自动推导类型并分配内存,避免了手动使用 `new`。
```cpp
#include <memory>
int main() {
// 使用 std::make_unique 创建 unique_ptr
auto ptr = std::make_unique<int>(42); // 创建一个指向整数的 unique_ptr
return 0;
}
```
### 2. 直接使用 `new` 运算符
可以直接使用 `new` 运算符来初始化 `unique_ptr`。这种方法需要显式地使用 `new` 关键字。
```cpp
#include <memory>
int main() {
// 直接使用 new 初始化 unique_ptr
std::unique_ptr<int> ptr(new int(42)); // 创建一个指向整数的 unique_ptr
return 0;
}
```
### 3. 初始化为空
可以初始化一个空的 `unique_ptr`,随后可以在需要时赋值。
```cpp
#include <memory>
int main() {
// 初始化为空
std::unique_ptr<int> ptr; // ptr 是 nullptr
ptr = std::make_unique<int>(42); // 赋值
return 0;
}
```
### 4. 通过移动构造函数
如果有一个现有的 `unique_ptr`,可以通过移动构造函数来初始化另一个 `unique_ptr`。注意,这样会使源指针变为 nullptr。
```cpp
#include <memory>
int main() {
auto ptr1 = std::make_unique<int>(42); // ptr1 拥有 42
std::unique_ptr<int> ptr2 = std::move(ptr1); // ptr2 现在拥有 42,ptr1 变为 nullptr
return 0;
}
```
### 5. 通过自定义删除器
可以使用自定义删除器初始化 `unique_ptr`,这在需要特定的释放操作时非常有用。
```cpp
#include <memory>
#include <iostream>
struct CustomDeleter {
void operator()(int* p) const {
std::cout << "Deleting pointer" << std::endl;
delete p;
}
};
int main() {
// 使用自定义删除器初始化 unique_ptr
std::unique_ptr<int, CustomDeleter> ptr(new int(42), CustomDeleter());
return 0;
}
```
### 总结
- **推荐使用 `std::make_unique`**:在 C++14 及更高版本中,它提供了更安全的内存管理和避免内存泄漏的机制。
- **直接使用 `new`**:在 C++11 中,`new` 是有效的初始化方法,但需要注意资源管理。
- **自定义删除器**:在特定场景下需要使用自定义删除逻辑时,可以使用自定义删除器。
使用 `unique_ptr` 的主要目的是管理动态内存,确保在超出作用域时自动释放资源,从而避免内存泄漏。