shared_ptr是一个共享所有权的智能指针,允许多个指针实例共同拥有和管理同一个对象,支持引用计数机制和自动内存管理- 普通引用和右值引用的主要区别在于后者“暗示”可能会"窃取"资源(虽然在此程序中没有实际移动),总结如下:
| 特性 | 普通引用 (&) | 右值引用 (&&) |
|---|---|---|
| 接受参数 | 左值(变量名) | 右值(临时对象、std::move的结果) |
| 调用方式 | func(var) |
func(std::move(var)) 或 func(temp_obj) |
| 引用计数 | 不变 | 不变 |
| 语义含义 | 借用使用 | 准备转移所有权 |
| 原对象状态 | 保持不变 | 可能被"移动走"(取决于函数实现) |
make_shared是用于创建shared_ptr的模板函数,相比传统方式(如std::shared_ptr<int> ptr(new int(42));),内存效率更高,异常安全,总结如下:
| 特性 | make_shared | shared_ptr(new T) |
|---|---|---|
| 内存效率 | 高(一次分配) | 低(两次分配) |
| 异常安全 | 是 | 可能不安全 |
| 代码简洁 | 是 | 较冗长 |
| 自定义删除器 | 不支持 | 支持 |
| 内存释放 | 可能延迟 | 及时 |
shared_ptr、unique_ptr以及weak_ptr的区别如下:
| 特性 | shared_ptr | unique_ptr | weak_ptr |
|---|---|---|---|
| 所有权 | 共享 | 独占 | 非拥有 |
| 复制 | 可以 | 不可以 | 可以 |
| 引用计数 | 有 | 无 | 不增加计数 |
| 性能开销 | 较高 | 很低 | 低 |