拷贝shared_ptr增加引用计数并共享所有权,移动则转移所有权且不改变引用计数。

在C++中,std::shared_ptr 是一种智能指针,用于管理动态分配对象的生命周期。它通过引用计数机制确保多个 shared_ptr 实例可以安全地共享同一个对象,当最后一个 shared_ptr 被销毁或重置时,所指向的对象会被自动释放。
拷贝操作规则
拷贝一个 shared_ptr 会增加其所指向对象的引用计数:
- 执行拷贝构造(如
shared_ptr
)或赋值操作(如ptr2(ptr1); ptr2 = ptr1;
)时,引用计数加1。 - 两个 shared_ptr 指向同一对象,共享所有权。
- 拷贝是线程安全的:多个线程同时拷贝同一个 shared_ptr 不会导致数据竞争。
- 原始指针和引用计数块通常存储在堆上,拷贝只涉及指针和原子操作更新引用计数。
移动操作规则
移动一个 shared_ptr 不增加引用计数,而是将所有权从源转移到目标:
- 移动构造或移动赋值后,源 shared_ptr 变为
nullptr
,不再拥有对象。 - 目标 shared_ptr 接管原对象的所有权,引用计数保持不变。
- 移动操作比拷贝更高效,因为不涉及原子引用计数递增/递减。
- 适用于临时对象或函数返回值,避免不必要的引用计数操作。
常见使用场景对比
理解何时用拷贝、何时用移动有助于提升性能和代码清晰度:
立即学习“C++免费学习笔记(深入)”;
- 函数传参:若需保留所有权,按值传递 shared_ptr 本质是拷贝,安全但有开销;若只是转发,考虑使用引用(const&)或移动。
- 函数返回:返回局部创建的 shared_ptr 会被自动移动(C++11起支持返回值优化和移动)。
- 容器插入:使用 emplace 或 move 避免多余拷贝。










