

























在 C++ 中,std::unique_ptr 和 std::shared_ptr 都支持自定义删除器(deleter),但它们在实现和使用上有一些关键区别。以下是它们的异同点:
支持自定义删除器
两者都允许通过模板参数或构造函数参数指定删除器,用于管理资源释放(如文件句柄、内存、网络连接等)。
默认删除器行为相同
如果不指定删除器,两者默认使用 delete 或 delete[](针对数组版本)释放资源。
std::unique_ptr
std::default_delete<T>。unique_ptr 是不同类型,不能直接互相赋值或传递。std::unique_ptr<FILE, decltype(&fclose)> file(fopen("test.txt", "r"), &fclose);
std::shared_ptr
shared_ptr 的类型始终是 std::shared_ptr<T>,因此不同删除器的 shared_ptr 可以互相赋值或传递。std::shared_ptr<FILE> file(fopen("test.txt", "r"), &fclose);
std::unique_ptr
std::shared_ptr
std::unique_ptr
std::shared_ptr
auto deleter = [](FILE* f) { fclose(f); };
std::shared_ptr<FILE> file(fopen("test.txt", "r"), deleter);
std::unique_ptr
std::unique_ptr<T[]>),默认调用 delete[]。std::unique_ptr<int[]> arr(new int[10]);
std::shared_ptr
delete[])。std::default_delete<T[]> 或 std::make_shared 的扩展。std::shared_ptr<int> arr(new int[10], std::default_delete<int[]>());
| 特性 | std::unique_ptr |
std::shared_ptr |
|---|---|---|
| 删除器存储位置 | 编译期确定(类型的一部分) | 运行时动态存储(控制块中) |
| 类型影响 | 删除器不同则类型不同 | 删除器不影响类型 |
| 性能 | 无额外开销 | 轻微运行时开销 |
| 灵活性 | 需显式指定模板参数 | 支持任意可调用对象 |
| 数组支持 | 直接支持(unique_ptr<T[]>) |
需手动指定删除器(如 default_delete<T[]>) |
std::unique_ptr,除非需要共享所有权。std::shared_ptr。std::unique_ptr<T[]> 或 C++17 的 std::shared_ptr 改进。此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。