news 2026/8/26 16:02:46

深入理解C++智能指针std::unique_ptr<一> 访问对象,获取裸指针,释放所有权,重置

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深入理解C++智能指针std::unique_ptr<一> 访问对象,获取裸指针,释放所有权,重置

访问对象:使用 * 或 ->

获取裸指针:使用 .get(),注意不要用返回的指针去 delete。

释放所有权:使用 .release(),它会返回裸指针,并将 unique_ptr 置空,但不释放内存,需要你手动管理返回的指针

重置:使用 .reset(),它会删除当前管理的对象,并可选择接管新对象。

#include <iostream> #include <memory> // 引入 unique_ptr // 一个简单的测试类 class Test { public: int value; Test(int v) : value(v) { std::cout << "🔧 Test 对象构造, value = " << value << std::endl; } ~Test() { std::cout << "💥 Test 对象析构, value = " << value << std::endl; } void print() const { std::cout << "📝 print() 被调用, value = " << value << std::endl; } }; int main() { std::cout << "========== 程序开始 ==========" << std::endl; // ============================================ // 1. 创建 unique_ptr // ============================================ std::cout << "\n【1. 创建 unique_ptr】" << std::endl; auto ptr = std::make_unique<Test>(100); // ============================================ // 2. 访问对象(使用 -> 和 *) // ============================================ std::cout << "\n【2. 访问对象】" << std::endl; // 使用 -> 调用成员函数 ptr->print(); // 使用 -> 访问成员变量 std::cout << "通过 -> 访问 value: " << ptr->value << std::endl; // 使用 * 解引用获取对象本身 (*ptr).value = 200; std::cout << "通过 * 修改 value 后: " << (*ptr).value << std::endl; // ============================================ // 3. 获取裸指针(使用 .get()) // ============================================ std::cout << "\n【3. 获取裸指针】" << std::endl; Test* raw_ptr = ptr.get(); std::cout << "裸指针指向的 value: " << raw_ptr->value << std::endl; std::cout << "注意:不要 delete raw_ptr,ptr 仍拥有所有权" << std::endl; // ============================================ // 4. 释放所有权(使用 .release()) // ============================================ std::cout << "\n【4. 释放所有权 (.release())】" << std::endl; std::cout << "释放前,ptr " << (ptr ? "非空" : "为空") << std::endl; Test* released_ptr = ptr.release(); // ptr 放弃所有权,返回裸指针 std::cout << "释放后,ptr " << (ptr ? "非空" : "为空") << std::endl; std::cout << "被释放的裸指针指向的 value: " << released_ptr->value << std::endl; std::cout << "⚠️ 注意:现在需要手动 delete released_ptr!" << std::endl; delete released_ptr; // 必须手动释放! std::cout << "✅ 已手动 delete" << std::endl; // ============================================ // 5. 重置(使用 .reset()) // ============================================ std::cout << "\n【5. 重置 (.reset())】" << std::endl; // 5.1 reset() 不带参数:删除当前对象,置为空 auto ptr2 = std::make_unique<Test>(300); std::cout << "ptr2 reset 前 " << (ptr2 ? "非空" : "为空") << std::endl; ptr2.reset(); // 删除对象,ptr2 变为空 std::cout << "ptr2 reset() 后 " << (ptr2 ? "非空" : "为空") << std::endl; // 5.2 reset() 带参数:删除旧对象,接管新对象 std::cout << "\n--- reset(new对象) 演示 ---" << std::endl; auto ptr3 = std::make_unique<Test>(400); std::cout << "ptr3 当前 value = " << ptr3->value << std::endl; ptr3.reset(new Test(500)); // 先析构旧的(400),再构造新的(500) std::cout << "ptr3 reset 后 value = " << ptr3->value << std::endl; // ============================================ // 6. 使用 std::move 转移所有权(补充) // ============================================ std::cout << "\n【6. 补充:移动语义转移所有权】" << std::endl; auto ptr4 = std::make_unique<Test>(600); std::cout << "ptr4 创建成功,ptr4 " << (ptr4 ? "非空" : "为空") << std::endl; auto ptr5 = std::move(ptr4); // 所有权转移,ptr4 变为空 std::cout << "move 后,ptr4 " << (ptr4 ? "非空" : "为空") << std::endl; std::cout << "move 后,ptr5 " << (ptr5 ? "非空" : "为空") << ",value = " << ptr5->value << std::endl; // ptr5 在作用域结束时会自动释放 std::cout << "\n========== main 结束,所有资源已清理 ==========" << std::endl; return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/26 16:01:01

告别 Demo 陷阱!2026 企业 BI 与决策智能选型指南

2026年&#xff0c;BI市场正在经历一场从「看数」到「问数」、再到「决策」的集体跃迁。几组数据勾勒出这场转变的烈度&#xff1a;IDC数据显示&#xff0c;2025年中国BI软件市场规模达13.2亿美元&#xff0c;连续6年保持25%以上的同比增速&#xff0c;贡献了亚太地区65%以上的…

作者头像 李华
网站建设 2026/8/26 15:56:51

2026年值得关注的大模型AI客服厂商:不同技术路线与适用企业分析

企业选择AI客服系统时&#xff0c;不应只关注模型能力&#xff0c;而需要结合自身业务场景&#xff0c;综合评估服务渠道、系统连接、流程自动化、部署方式和长期运营能力。 本文从技术路线和适用企业角度&#xff0c;对2026年值得关注的大模型AI客服厂商进行分析。一、2026年A…

作者头像 李华
网站建设 2026/8/26 15:53:13

谷歌:Agent Gym实现智能体持续进化

&#x1f4d6;标题&#xff1a;Agent Gym: A Framework for Continuous Evaluation and Evolution of LLM Agents Through Human-in-the-Loop Feedback &#x1f310;来源&#xff1a;arXiv, 2608.15591v1 &#x1f6ce;️文章简介 &#x1f538;研究问题&#xff1a;如何解决大…

作者头像 李华
网站建设 2026/8/26 15:46:57

K歌语音指令智能语音识别,夏杰语音对接源码

简介实现语音K歌&#xff0c;语音搜索歌曲、歌手&#xff0c;原唱&#xff0c;伴唱&#xff0c;升调、降调&#xff0c;收藏&#xff0c;热门歌曲&#xff0c;歌曲排行等等语音控制指令。 参考demo&#xff0c;可以合入到自己的K歌软件里面。 自动对接夏杰语音&#xff0c;安装…

作者头像 李华