std::shared_ptr
是 C++11 标准库中的智能指针类型,用于管理动态分配的对象。与传统指针不同,std::shared_ptr
自动管理内存,并在不再使用时自动释放对象,以避免内存泄漏。它是一种共享所有权的智能指针,即可以让多个 std::shared_ptr
指向同一个对象,并且会记录有多少个 std::shared_ptr
拥有该对象。
使用方法
#include <memory>
#include <iostream>
int main() {
std::shared_ptr<int> p1 = std::make_shared<int>(10); // 创建一个指向整数10的shared_ptr
std::cout << *p1 << std::endl; // 输出:10
{
std::shared_ptr<int> p2 = p1; // p2 共享 p1 所指向的对象
std::cout << "Use count: " << p1.use_count() << std::endl; // 输出:2
} // p2 离开作用域,引用计数减少
std::cout << "Use count after p2 out of scope: " << p1.use_count() << std::endl; // 输出:1
return 0;
}
关键特性
- 引用计数:每一个
std::shared_ptr
对象都会维护一个引用计数。当创建新的std::shared_ptr
指向相同对象时,引用计数增加;当某个std::shared_ptr
被销毁时,引用计数减少。当引用计数为 0 时,std::shared_ptr
会自动释放对象的内存。- 可以通过
use_count()
获取当前的引用计数。
- 可以通过
- 线程安全:多个
std::shared_ptr
指向同一对象时,引用计数操作是线程安全的。 - 支持自定义删除器:
std::shared_ptr
可以在创建时指定删除器函数,用于释放资源时执行特定操作。
常见操作
- 创建
std::shared_ptr
:- 推荐使用
std::make_shared<T>(args...)
以提高效率。 - 直接使用
new
创建时,需要传递给std::shared_ptr<T>
构造函数,如std::shared_ptr<int> p(new int(10));
。
- 推荐使用
- 访问和修改对象:
- 使用
*
和->
操作符访问所指向的对象,如*p1
或p1->someMethod()
。
- 使用
- 检查引用计数:
- 使用
p1.use_count()
获取当前引用计数。
- 使用
适用场景
std::shared_ptr
适合在多个地方需要共享同一个对象时使用,如在函数之间传递、容器存储等。需要注意的是,如果两个 std::shared_ptr
相互引用,可能导致内存无法释放(循环引用),此时可以配合 std::weak_ptr
来解决。