自考在线做试卷的网站,注册局官网,温州制作手机网站,如何规划企业网站std::unique_ptr 是 C11 引入的智能指针#xff0c;用于管理动态分配的对象的生命周期。unique_ptr 确保每个动态分配的对象有且仅有一个所有者#xff0c;当 unique_ptr 超出作用域时#xff0c;它会自动释放其管理的对象。以下是 std::unique_ptr 的一些常见初始化方法。 …std::unique_ptr 是 C11 引入的智能指针用于管理动态分配的对象的生命周期。unique_ptr 确保每个动态分配的对象有且仅有一个所有者当 unique_ptr 超出作用域时它会自动释放其管理的对象。以下是 std::unique_ptr 的一些常见初始化方法。
### 1. 使用 std::make_unique
std::make_unique 是 C14 中引入的函数提供了一种安全的方式来创建 unique_ptr。它会自动推导类型并分配内存避免了手动使用 new。
cpp #include memory
int main() { // 使用 std::make_unique 创建 unique_ptr auto ptr std::make_uniqueint(42); // 创建一个指向整数的 unique_ptr return 0; }
### 2. 直接使用 new 运算符
可以直接使用 new 运算符来初始化 unique_ptr。这种方法需要显式地使用 new 关键字。
cpp #include memory
int main() { // 直接使用 new 初始化 unique_ptr std::unique_ptrint ptr(new int(42)); // 创建一个指向整数的 unique_ptr return 0; }
### 3. 初始化为空
可以初始化一个空的 unique_ptr随后可以在需要时赋值。
cpp #include memory
int main() { // 初始化为空 std::unique_ptrint ptr; // ptr 是 nullptr ptr std::make_uniqueint(42); // 赋值 return 0; }
### 4. 通过移动构造函数
如果有一个现有的 unique_ptr可以通过移动构造函数来初始化另一个 unique_ptr。注意这样会使源指针变为 nullptr。
cpp #include memory
int main() { auto ptr1 std::make_uniqueint(42); // ptr1 拥有 42 std::unique_ptrint ptr2 std::move(ptr1); // ptr2 现在拥有 42ptr1 变为 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_ptrint, CustomDeleter ptr(new int(42), CustomDeleter()); return 0; }
### 总结
- **推荐使用 std::make_unique**在 C14 及更高版本中它提供了更安全的内存管理和避免内存泄漏的机制。 - **直接使用 new**在 C11 中new 是有效的初始化方法但需要注意资源管理。 - **自定义删除器**在特定场景下需要使用自定义删除逻辑时可以使用自定义删除器。
使用 unique_ptr 的主要目的是管理动态内存确保在超出作用域时自动释放资源从而避免内存泄漏。