C++智能指针的基本概念与类型
C++智能指针是自动管理动态分配内存的模板类,它们在头文件<memory>中定义。主要类型包括unique_ptr、shared_ptr和weak_ptr。unique_ptr代表独占所有权,一个对象只能由一个unique_ptr拥有;shared_ptr通过引用计数实现共享所有权,当最后一个shared_ptr离开作用域时释放内存;weak_ptr是shared_ptr的辅助指针,不增加引用计数,用于解决循环引用问题。
unique_ptr的使用与实践
unique_ptr适用于独占资源所有权的场景。使用std::make_unique(C++14及以上)创建unique_ptr是最佳实践,它提供异常安全保证。例如:auto ptr = std::make_unique<int>(42);。unique_ptr禁止拷贝,但支持移动语义,可通过std::move转移所有权。自定义删除器允许处理特殊资源释放需求,如文件指针或自定义分配的内存。
shared_ptr与引用计数机制
shared_ptr通过引用计数管理资源共享。使用std::make_shared创建shared_ptr,它一次性分配内存存储对象和引用计数,提高效率。例如:auto ptr = std::make_shared<MyClass>();。循环引用是shared_ptr的常见陷阱,会导致内存泄漏。例如,两个对象互相持有对方的shared_ptr。解决方案是使用weak_ptr打破循环,weak_ptr不增加引用计数,可通过lock()方法获取临时的shared_ptr访问资源。
weak_ptr的应用场景
weak_ptr主要用于解决shared_ptr的循环引用问题。它不控制对象生命周期,但可观察资源是否存在。典型用法包括缓存、观察者模式和依赖注入。例如,在缓存中存储weak_ptr,当主要所有者释放资源时,缓存自动失效。使用weak_ptr::lock()获取shared_ptr,若返回空则表示资源已被释放,避免了悬空指针风险。
智能指针与异常安全
智能指针显著提升代码的异常安全性。传统手动管理内存时,异常可能导致内存泄漏,而智能指针保证在栈展开时自动释放资源。例如,在函数中使用unique_ptr,即使抛出异常,资源也能正确释放。结合RAII(资源获取即初始化)原则,智能指针确保资源管理与对象生命周期绑定,减少错误。
自定义删除器与高级用法
智能指针支持自定义删除器,处理非标准资源释放。例如,使用unique_ptr管理文件句柄:auto fptr = std::unique_ptr<FILE, decltype(&fclose)>(fopen(file.txt, r), fclose);。对于数组,C++17提供std::make_unique_for_overwrite和数组特化版本,但更推荐使用std::vector替代动态数组。shared_ptr的自定义删除器影响类型系统,需在构造时指定。
性能考量与最佳实践
智能指针引入轻微开销,如引用计数操作,但通常可忽略。避免过度使用shared_ptr,优先选择unique_ptr以减少性能损耗。不要使用智能指针管理非堆内存或静态内存。迁移遗留代码时,逐步替换new/delete为智能指针。调试时注意循环引用和误用weak_ptr导致的访问失败。静态分析工具可帮助检测智能指针的误用。
354

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



