C++ 智能指针完全指南
一、RAII 基础
资源获取即初始化(RAII)是 C++ 的核心设计理念。通过将资源封装在对象中,利用构造函数获取资源、析构函数释放资源,实现自动生命周期管理:
class FileHandle {
public:
FileHandle(const char* filename) : handle(fopen(filename, "r")) {}
~FileHandle() { if(handle) fclose(handle); }
private:
FILE* handle;
};
二、智能指针分类
-
std::unique_ptr(独占所有权)auto ptr = std::make_unique<MyClass>(); // 所有权转移 auto new_owner = std::move(ptr); -
std::shared_ptr(共享所有权)auto shared = std::make_shared<MyClass>(); auto copy = shared; // 引用计数+1 -
std::weak_ptr(观察指针)std::weak_ptr<MyClass> observer = shared; if(auto locked = observer.lock()) { // 安全访问 }
三、内存管理原理
- 控制块结构
+----------------+ | 引用计数 | | 弱引用计数 | | 删除器 | | 分配器 | +----------------+ | v 对象数据 make_shared优化auto p = std::make_shared<MyClass>(); // 单次内存分配
四、循环引用解决方案
class Node {
public:
std::shared_ptr<Node> next;
std::weak_ptr<Node> prev; // 关键点
};
五、典型避坑场景
-
原始指针混用
auto ptr = std::make_shared<int>(42); int* raw = ptr.get(); delete raw; // 灾难! -
多线程安全
void unsafe_access() { if(!ptr.expired()) { auto p = ptr.lock(); // 此时可能已被销毁 p->do_something(); } } -
自定义删除器
auto file_ptr = std::unique_ptr<FILE, decltype(&fclose)>( fopen("data.txt", "r"), &fclose);
六、性能优化建议
- 优先使用
std::make_unique/std::make_shared - 高频传递时使用
const std::shared_ptr<T>& - 对象池模式管理短生命周期对象
完整示例代码见:[GitHub Gist 链接]
注:实际开发中需结合 Valgrind 或 AddressSanitizer 进行内存检测
1741

被折叠的 条评论
为什么被折叠?



