unique_ptr是C++中用于独占式资源管理的智能指针,定义于头文件,通过移动语义转移所有权,禁止拷贝,确保同一时间仅一个指针拥有资源,离开作用域时自动释放,支持自定义删除器处理非内存资源,提升代码安全与可维护性。

在C++中,unique_ptr 是一种智能指针,用于实现独占式资源管理。它确保同一时间只有一个 unique_ptr 拥有对资源的控制权,当该指针被销毁时,其所管理的对象会自动被释放,从而避免内存泄漏。
std::unique_ptr 定义在 unique_ptr 获得了某个动态分配对象的控制权,其他指针就不能共享这个所有权。
由于禁止拷贝构造和拷贝赋值,unique_ptr 只能通过移动语义转移所有权。
创建并使用 unique_ptr 非常简单:
#include <memory>
#include <iostream>
<p>int main() {
// 使用 make_unique 创建 unique_ptr(C++14 起支持)
auto ptr = std::make_unique<int>(42);</p><pre class='brush:php;toolbar:false;'>// 访问值
std::cout << *ptr << '\n'; // 输出 42
// 自动释放:离开作用域时,内存自动释放
return 0;}
上面的例子中,ptr 在函数结束时超出作用域,其析构函数会被调用,自动删除所指向的 int 对象。
因为 unique_ptr 不允许复制,但支持移动:
Primeshot
专业级AI人像摄影工作室
36
查看详情
auto ptr1 = std::make_unique<std::string>("hello");
// auto ptr2 = ptr1; // 错误:不能复制
auto ptr2 = std::move(ptr1); // 正确:转移所有权
<p>if (ptr1 == nullptr) {
std::cout << "ptr1 现在为空\n";
}
if (ptr2 != nullptr) {
std::cout << *ptr2 << '\n'; // 输出 hello
}</p>执行 std::move(ptr1) 后,ptr1 不再拥有资源,变为 null,而 ptr2 成为唯一所有者。
你可以将 unique_ptr 作为函数参数传递,通常以值方式接收来实现所有权转移:
void process(std::unique_ptr<int> data) {
std::cout << "处理数据:" << *data << '\n';
} // data 在这里被销毁
<p>auto ptr = std::make_unique<int>(100);
process(std::move(ptr)); // 转移所有权给函数
// ptr 现在为空</p>也可以从函数返回 unique_ptr,用于工厂模式或封装资源创建逻辑:
std::unique_ptr<std::string> createMessage() {
return std::make_unique<std::string>("你好,世界!");
}
<p>auto msg = createMessage(); // 接收所有权
std::cout << *msg << '\n';</p>有时需要释放非内存资源或使用特定释放方式(如 free()、CloseHandle()),可以为 unique_ptr 指定自定义删除器:
void close_file(FILE* fp) {
if (fp) {
std::fclose(fp);
std::cout << "文件已关闭\n";
}
}
<p>auto file = std::unique_ptr<FILE, decltype(&close_file)>(
std::fopen("test.txt", "w"),
&close_file
);</p><p>if (file) {
std::fprintf(file.get(), "写入内容\n");
} // 离开作用域时自动调用 close_file</p>这样即使发生异常,也能保证文件正确关闭。
基本上就这些。合理使用 unique_ptr 能显著提升代码的安全性和可维护性,是现代 C++ 资源管理的首选方式之一。
以上就是C++怎么使用unique_ptr管理资源_C++智能指针与所有权模型的详细内容,更多请关注其它相关文章!
# 为空
# 滨湖区网站设计优化推广
# 遂宁营销推广专业团队名单
# 营销推广选择哪个好
# 稷山网站推广服务
# 都匀兴趣班网站推广
# seo岗位职责和素质
# 安康哪家网站推广好做
# 培训网站建设规定
# 蔚县seo优化时间
# seo外链建设难吗
# 头文件
# 基础设施
# 工具
# 高性能
# 数据结构
# 是一种
# 资源管理
# 自定义
# 自己的
# 如何使用
# 作用域
# stream
# ios
# c++
# ai
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
百度小说看书时如何翻页_百度小说手动翻页与自动翻页设置
苹果11如何更换iCloud账号_苹果11账号切换的具体步骤
rabbitmq 持久化有什么缺点?
抖音团长模式怎么做?团长模式是什么意思?
优化2xN网格最大路径和的动态规划算法实践
之了课堂app做题入口
猫眼电影app如何筛选支持退改签的影院_猫眼电影退改签影院筛选方法
空腹吃苹果好吗 苹果空腹摄入指南
《KARDS》冬季扩展包“国土阵线”上线!全新“协力”机制改变战场格局
J*a中为什么强调组合优于继承_组合模式带来的灵活性与可维护性解析
Apple Music无故扣费引质疑
《飞猪旅行》购买汽车票方法
PHP动态导航按钮:根据用户登录状态切换链接与文本
手机耗电快是什么原因 延长手机电池续航时间的设置方法【详解】
《宝可梦大集结》S4冠军之路开始时间介绍
实现可重用自定义Python Range类
抖音视频如何添加标题?添加标题有哪些好处?
《画加》约稿流程
厨房地面防滑垫的油污怎么洗? 机洗和手洗防滑垫的注意事项
C++怎么解决数值计算中的精度问题_C++浮点数误差与数值稳定性分析
yy漫画登录页面官方入口_yy漫画在线阅读网址入口
Python模块化编程:避免循环导入与共享函数的最佳实践
键盘测试软件哪个好_键盘故障检测工具推荐
《新三国志曹操传》游历事件袁尚突围攻略
Python实战:高效处理实时数据流中的最小/最大值
PHP utf8_encode 字符编码转换疑难解析与最佳实践
火狐浏览器无法自动更新怎么办 手动更新火狐浏览器到最新版本【解决】
在Flask应用中安全高效地更新SQLAlchemy用户数据
win11如何开启单声道音频 Win11为听障用户合并左右声道【辅助】
LINUX怎么查看显卡信息_LINUX查看GPU状态
如何在CSS中设置背景图像:一个全面指南
Microsoft Edge网页字体太淡看不清怎么办_Microsoft Edge字体渲染优化技巧
FotoBalloon图片左右镜像教程
抖音猜你想搜能说明对方搜过吗
搜狗浏览器如何查找页面中的文字 搜狗浏览器Ctrl+F页面搜索功能
CSS绝对定位与溢出控制:实现背景元素局部显示不触发滚动条
纯CSS实现滚动时动态时间轴线条颜色填充效果
店铺如何做视频号推广?做视频号推广有用吗?
Linux如何自动分析系统异常日志_Linux日志智能检测
sublime怎么快速在浏览器中预览HTML_sublime配置View in Browser教程
掌握产品代码正则表达式:避免常见陷阱与精确匹配
CodeIgniter 3 中基于 MySQL 数据高效生成动态图表教程
微博网页版访问入口 微博网页版网页端使用指南
t3出行如何使用微信支付
铁路12306官网入口 铁路12306中国铁路官网登录首页
《随手记》备份数据方法
OTT月报 | 2025年9月智能电视大数据报告
J*aScript实现网页表单实时输入字段比较与验证教程
毒蘑菇VOLUMESHADER_BM官网首页登录入口 毒蘑菇VOLUMESHADER_BM官网首页登录入口说明
word页码灰色不能用如何解决
2025-11-19
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。