
在C++中,std::unique_ptr 是一种智能指针,用于管理动态分配的对象,确保该对象在其作用域结束时自动被释放。它实现了独占式的所有权语义——即同一时间只有一个 unique_ptr 可以拥有某个对象,防止资源的重复释放或内存泄漏。
1. 基本用法与创建方式unique_ptr 定义在头文件 <memory> 中,使用前需包含此头文件。
最简单的创建方式是使用 std::make_unique(C++14 起支持):
#include <memory>
#include <iostream>
<p>int main() {
auto ptr = std::make_unique<int>(42);
std::cout << *ptr << "\n"; // 输出: 42
return 0;
}</p> 如果不能使用 C++14,也可以直接构造:
std::unique_ptr<int> ptr(new int(42));
但推荐使用 make_unique,因为它更安全、更高效,并能避免一些异常安全问题。
2. 独占所有权特性unique_ptr 不允许拷贝构造和拷贝赋值,因为其所有权是独占的。
auto ptr1 = std::make_unique<int>(10); // auto ptr2 = ptr1; // 错误:不能拷贝 // auto ptr3 = ptr1.get(); // 错误:裸指针不接管所有权 <p>auto ptr4 = std::move(ptr1); // 正确:通过 move 转移所有权 // 此时 ptr1 为空,ptr4 拥有对象</p>
调用 std::move 后,原指针变为 null,不能再访问其所指向的对象。
3. 自定义删除器默认情况下,unique_ptr 使用 delete 释放资源,但你可以指定自定义删除器来处理特殊场景,比如释放数组、调用特定函数等。
HyperWrite
AI写作助手帮助你创作内容更自信
54
查看详情
// 处理数组
auto array_ptr = std::make_unique<int[]>(10); // C++14 起支持
for (int i = 0; i < 10; ++i) array_ptr[i] = i;
<p>// 或者手动指定删除器(如关闭文件)
auto file_deleter = [](FILE* f) {
if (f) fclose(f);
};
std::unique_ptr<FILE, decltype(file_deleter)> fp(fopen("test.txt", "r"), file_deleter);</p><p>// 使用 lambda 作为删除器时需显式指定类型</p> 4. 作为函数参数和返回值
unique_ptr 非常适合用于函数间传递资源,尤其是工厂模式中返回动态对象。
std::unique_ptr<int> create_value() {
return std::make_unique<int>(100);
}
<p>void use_value(std::unique_ptr<int> data) {
std::cout << *data << "\n";
}</p><p>int main() {
auto p = create_value(); // 接收所有权
use_value(std::move(p)); // 传递所有权
// 此时 p 已为空
return 0;
}</p> 若函数只需读取数据而不获取所有权,应传 const 引用:
void inspect(const std::unique_ptr<int>& ptr) {
if (ptr) std::cout << *ptr << "\n";
}
5. 与裸指针交互
可通过 get() 获取底层裸指针,但不会转移所有权:
auto ptr = std::make_unique<int>(42); int* raw = ptr.get(); // raw 指向同一地址 *raw = 100; std::cout << *ptr; // 输出: 100
也可用 release() 主动释放所有权并返回裸指针:
int* released_ptr = ptr.release(); // ptr 变为 nullptr,不释放内存 // 必须手动 delete released_ptr 否则会内存泄漏 delete released_ptr;6. 常见应用场景
- 替代原始指针实现 RAII 资源管理
- 类中管理动态成员变量,避免手动析构
- 工厂函数返回动态对象
- 异常安全代码中防止资源泄漏
基本上就这些。合理使用 unique_ptr 能显著提升代码的安全性和可维护性,减少内存错误。只要记住:谁拥有,谁释放;转移用 move;别拷贝。不复杂但容易忽略细节。
以上就是c++++中如何使用unique_ptr_C++智能指针unique_ptr用法详解的详细内容,更多请关注知识资源分享宝库其它相关文章!
相关标签: c++ ai ios 作用域 NULL 成员变量 const 指针 delete 对象 作用域 大家都在看: c++中如何使用map_C++ map关联容器使用详解 c++中如何调用c语言函数_c++与c语言函数混合调用方法 C++环境搭建需要哪些基础步骤 C++内存模型与并发容器实现原理 如何在C++中链接一个外部库_C++外部库链接配置方法






发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。