std::shared_ptr 介绍
std::shared_ptr是 C++11 引入的智能指针之一,用于管理动态分配对象的生命周期,通过引用计数机制实现共享所有权。
基本特性
-
共享所有权:多个
shared_ptr可以共同拥有同一个对象 -
自动释放:当最后一个
shared_ptr被销毁时,它所管理的对象会被自动删除 -
线程安全:引用计数操作是原子操作,线程安全(但管理的对象本身不是线程安全的)
#include <memory>
#include <iostream>
class MyClass {
public:
MyClass() { std::cout << "MyClass constructed\n"; }
~MyClass() { std::cout << "MyClass destroyed\n"; }
void doSomething() { std::cout << "Doing something\n"; }
};
int main() {
// 创建 shared_ptr
std::shared_ptr<MyClass> ptr1(new MyClass());
// 使用 make_shared 更高效(推荐方式)
auto ptr2 = std::make_shared<MyClass>();
// 共享所有权
std::shared_ptr<MyClass> ptr3 = ptr2;
// 使用指针
ptr1->doSomething();
(*ptr2).doSomething();
// 获取原始指针(谨慎使用)
MyClass* rawPtr = ptr3.get();
// 重置指针
ptr1.reset(); // 释放所有权
// 检查是否有所有权
if (ptr1) {
std::cout << "ptr1 owns an object\n";
} else {
std::cout << "ptr1 is empty\n";
}
return 0;
// ptr2 和 ptr3 离开作用域,对象被自动销毁
}
注意事项
-
避免循环引用:可能导致内存泄漏,可使用
std::weak_ptr解决
class B;
class A {
std::shared_ptr<B> b_ptr;
};
class B {
std::shared_ptr<A> a_ptr; // 循环引用
};
优先使用 make_shared:更高效(单次内存分配),且更安全
auto p = std::make_shared<int>(42); // 推荐
-
不适用于数组(C++17 前):管理数组应使用
std::shared_ptr<T[]>(C++17)或std::vector
std::shared_ptr是 C++ 中管理动态内存的强大工具,正确使用可以大大减少内存泄漏的风险。
浙公网安备 33010602011771号