
1) 【一句话结论】std::shared_ptr和std::unique_ptr的核心区别在于所有权管理方式,前者支持共享(通过引用计数),后者独占(通过移动语义),导致内存释放机制和拷贝行为不同。
2) 【原理/概念讲解】智能指针用于自动管理动态分配的内存,避免内存泄漏。
fclose)。类比:唯一钥匙,只能一个人用,用完钥匙归自己处理。3) 【对比与适用场景】
| 特性 | std::unique_ptr | std::shared_ptr |
|---|---|---|
| 定义 | 独占资源所有权 | 共享资源所有权 |
| 拷贝行为 | 不能拷贝(移动除外) | 拷贝后引用计数+1 |
| 内存管理 | 自动释放(删除器) | 引用计数管理,0时释放 |
| 典型场景 | 管理唯一资源(文件、唯一对象) | 管理多模块共享资源(配置、数据库连接) |
4) 【示例】
// 伪代码
auto file = std::unique_ptr<FILE, decltype(&fclose)>(
fopen("course.txt", "w"), fclose
);
if (file) {
fprintf(file.get(), "课程信息");
}
// file离开作用域时自动调用fclose关闭文件
// 伪代码
auto config = std::shared_ptr<Config>(new Config("default"));
// 多个模块拷贝config,引用计数增加
ModuleA a(config);
ModuleB b(config);
// 当所有模块都销毁后,config的引用计数为0,自动释放
5) 【面试口播版答案】
“面试官您好,std::shared_ptr和std::unique_ptr的主要区别在于所有权管理方式。std::unique_ptr是独占所有权,只能由一个对象持有,通过移动语义(如移动构造、移动赋值)转移所有权,自动调用删除器释放资源;而std::shared_ptr是共享所有权,多个对象可以共享同一资源,通过引用计数机制管理,拷贝后引用计数增加,销毁时减少,当引用计数为0时才释放资源。在线教育系统中,比如课程文件管理,每个课程文件只能被一个模块使用,用unique_ptr确保文件唯一且自动关闭;而用户配置信息需要多个服务共享,用shared_ptr保证资源在所有服务都使用完毕后释放。总结来说,unique_ptr适用于独占资源,shared_ptr适用于共享资源,选择取决于资源是否需要被多个部分共同持有。”
6) 【追问清单】
7) 【常见坑/雷区】