1. std::shared_ptr: 一个共享所有权的智能指针, 多个 shared_ptr 可以共享同一个对象。
C++11 引入的智能指针之一,属于内存管理机制的核心工具。它通过引用计数(Reference Counting)实现对动态分配对象的自动内存管理,避免内存泄漏。
线程安全:
shared_ptr 对象本身不是线程安全的(多个线程不能同时修改同一个 shared_ptr 变量)。
但多个线程持有不同的 shared_ptr 副本指向同一对象是安全的。
引用计数的操作是原子的。
auto ptr = std::make_shared<int>(42); // 推荐
std::shared_ptr<int> ptr(new int(42)); // 不推荐
2. std::weak_ptr 是 C++11 引入的弱引用智能指针,它与 std::shared_ptr 配合使用,用于解决 shared_ptr 的循环引用问题,避免内存泄漏。
不增加引用计数。
auto sp = std::make_shared<int>(42);
std::weak_ptr<int> wp = sp;
检查对象是否还存在
if (!wp.expired()) {
std::cout << "Object is still alive\n";
}
安全访问对象
auto obj = wp.lock(); // 返回 shared_ptr,
if (obj) { // 如果对象还存在, 引用计数 +1
std::cout << "Value: " << *obj << std::endl;
} else {
std::cout << "Object has been destroyed\n";
}
重置 weak_ptr
wp.reset(); // 断开连接
3. std::unique_ptr 是 C++11 引入的独占式智能指针,它保证同一时间只有一个 unique_ptr 拥有对动态资源的控制权,当它离开作用域时,所管理的对象会自动被删除,从而避免内存泄漏。
特点:
不可复制(delete 了拷贝构造和赋值)。
可以移动(move),所有权转移。
轻量、高效、零运行时开销(与裸指针性能几乎相同)。
原则:优先使用 unique_ptr,只有在需要共享时才用 shared_ptr。
std::unique_ptr<int> ptr1 = std::make_unique<int>(100);
std::unique_ptr<int> ptr2 = std::move(ptr1); // 所有权从 ptr1 转移到 ptr2
if (!ptr1) {// ptr1 现在为 nullptr
std::cout << "ptr1 is null\n";
}
std::unique_ptr<int> ptr3 = ptr2; // 编译错误!拷贝被删除
注意:
int* raw = ptr2.get(); // 获取原始指针,但不释放所有权
//不要手动 delete raw,否则 unique_ptr 析构时会双重释放。
数组支持
std::unique_ptr<int[]> arr = std::make_unique<int[]>(5);
arr[0] = 10;
arr[1] = 20;
// 自动调用 delete[],不是 delete
与 shared_ptr 的转换,反过来不行
std::unique_ptr<int> uptr = std::make_unique<int>(42);
std::shared_ptr<int> sptr = std::move(uptr); // unique_ptr → shared_ptr