智能指针Smart Pointer是 C 中用于管理动态分配内存的工具旨在自动处理内存的释放从而防止内存泄漏和悬空指针等常见错误。它们通过重载-和*运算符使得使用体验像普通指针一样但在生命周期结束时通常是离开作用域时会自动调用析构函数来释放资源。C11 标准引入了三种主要的智能指针均位于memory头文件中1.std::unique_ptr(独占所有权)特点同一时间只能有一个unique_ptr指向该对象。它不能被复制拷贝构造函数和拷贝赋值运算符被删除但可以被移动支持移动语义。适用场景当你希望明确某个资源只属于一个所有者且不需要共享时。这是性能开销最小、最推荐的默认选择。示例#include memory std::unique_ptrint p1 std::make_uniqueint(10); // std::unique_ptrint p2 p1; // 错误不能复制 std::unique_ptrint p2 std::move(p1); // 正确所有权转移p1 变为空2.std::shared_ptr(共享所有权)特点多个shared_ptr可以指向同一个对象。内部使用引用计数机制每增加一个指向该对象的shared_ptr计数加 1每销毁一个计数减 1。当计数归零时对象被自动删除。适用场景当多个部分需要共享同一个资源且无法确定哪个部分最后使用它时。注意循环引用问题。如果两个或多个shared_ptr互相引用例如 A 指向 BB 指向 A它们的引用计数永远不会归零导致内存泄漏。此时需配合std::weak_ptr使用。示例#include memory std::shared_ptrint p1 std::make_sharedint(20); std::shared_ptrint p2 p1; // 复制引用计数变为 2 // 当 p1 和 p2 都离开作用域时内存才会被释放3.std::weak_ptr(弱引用)特点不控制对象的生命周期不增加引用计数。它通常由shared_ptr构造而来。适用场景主要用于解决shared_ptr的循环引用问题或者作为缓存观察器对象可能已经不存在了。使用不能直接解引用必须先通过lock()成员函数尝试提升为shared_ptr。如果对象还存在返回有效的shared_ptr否则返回空的shared_ptr。示例std::weak_ptrint wp p1; if (auto sp wp.lock()) { // 提升为 shared_ptr // 安全使用 *sp } else { // 对象已被销毁 }最佳实践优先使用std::make_unique和std::make_shared避免显式使用new。异常安全如果在分配内存后、构造智能指针前抛出异常使用new会导致泄漏而make_函数是原子的。性能make_shared可以将控制块和对象分配在同一块内存中减少一次内存分配开销。默认首选unique_ptr除非确实需要共享所有权否则不要使用shared_ptr因为引用计数有运行时开销。不要混用不要用原始指针去初始化多个智能指针也不要手动delete智能指针管理的对象。简单对比表特性unique_ptrshared_ptrweak_ptr所有权独占共享无 (观察)拷贝禁止允许 (计数1)允许 (不计入计数)移动允许允许允许开销极低 (同裸指针)中 (原子计数操作)低 (需检查有效性)主要用途资源独占管理资源共享打破循环引用如果你需要针对特定场景的代码示例或更深入的原理分析如自定义删除器请告诉我
C++ 智能指针概要
智能指针Smart Pointer是 C 中用于管理动态分配内存的工具旨在自动处理内存的释放从而防止内存泄漏和悬空指针等常见错误。它们通过重载-和*运算符使得使用体验像普通指针一样但在生命周期结束时通常是离开作用域时会自动调用析构函数来释放资源。C11 标准引入了三种主要的智能指针均位于memory头文件中1.std::unique_ptr(独占所有权)特点同一时间只能有一个unique_ptr指向该对象。它不能被复制拷贝构造函数和拷贝赋值运算符被删除但可以被移动支持移动语义。适用场景当你希望明确某个资源只属于一个所有者且不需要共享时。这是性能开销最小、最推荐的默认选择。示例#include memory std::unique_ptrint p1 std::make_uniqueint(10); // std::unique_ptrint p2 p1; // 错误不能复制 std::unique_ptrint p2 std::move(p1); // 正确所有权转移p1 变为空2.std::shared_ptr(共享所有权)特点多个shared_ptr可以指向同一个对象。内部使用引用计数机制每增加一个指向该对象的shared_ptr计数加 1每销毁一个计数减 1。当计数归零时对象被自动删除。适用场景当多个部分需要共享同一个资源且无法确定哪个部分最后使用它时。注意循环引用问题。如果两个或多个shared_ptr互相引用例如 A 指向 BB 指向 A它们的引用计数永远不会归零导致内存泄漏。此时需配合std::weak_ptr使用。示例#include memory std::shared_ptrint p1 std::make_sharedint(20); std::shared_ptrint p2 p1; // 复制引用计数变为 2 // 当 p1 和 p2 都离开作用域时内存才会被释放3.std::weak_ptr(弱引用)特点不控制对象的生命周期不增加引用计数。它通常由shared_ptr构造而来。适用场景主要用于解决shared_ptr的循环引用问题或者作为缓存观察器对象可能已经不存在了。使用不能直接解引用必须先通过lock()成员函数尝试提升为shared_ptr。如果对象还存在返回有效的shared_ptr否则返回空的shared_ptr。示例std::weak_ptrint wp p1; if (auto sp wp.lock()) { // 提升为 shared_ptr // 安全使用 *sp } else { // 对象已被销毁 }最佳实践优先使用std::make_unique和std::make_shared避免显式使用new。异常安全如果在分配内存后、构造智能指针前抛出异常使用new会导致泄漏而make_函数是原子的。性能make_shared可以将控制块和对象分配在同一块内存中减少一次内存分配开销。默认首选unique_ptr除非确实需要共享所有权否则不要使用shared_ptr因为引用计数有运行时开销。不要混用不要用原始指针去初始化多个智能指针也不要手动delete智能指针管理的对象。简单对比表特性unique_ptrshared_ptrweak_ptr所有权独占共享无 (观察)拷贝禁止允许 (计数1)允许 (不计入计数)移动允许允许允许开销极低 (同裸指针)中 (原子计数操作)低 (需检查有效性)主要用途资源独占管理资源共享打破循环引用如果你需要针对特定场景的代码示例或更深入的原理分析如自定义删除器请告诉我