C++智能指针介绍

C++智能指针是用于自动管理动态内存的工具,通过RAII(Resource Acquisition Is Initialization)机制确保资源在不再需要时被正确释放,从而避免内存泄漏。以下是C++中主要智能指针的详细介绍:

1. ​**std::unique_ptr**

      ​性能与选择建议

正确使用智能指针可显著提升代码安全性和可维护性,是现代C++资源管理的核心工具之一。


  • 所有权模型:独占所有权,同一时间只能有一个unique_ptr指向某个对象。
  • 特点
    • 不可复制,但可通过std::move转移所有权。
    • 析构时自动释放所管理的对象。
    • 支持自定义删除器(如delete[])。
  • 使用场景
    • 管理独占资源的生命周期(如工厂模式返回的对象)。
    • 替代已废弃的auto_ptr
  • 示例
    #include <memory>
    auto ptr = std::make_unique<int>(42); // C++14起支持make_unique
    // 转移所有权
    std::unique_ptr<int> ptr2 = std::move(ptr);

    2. ​**std::shared_ptr**

  • 所有权模型:共享所有权,多个shared_ptr可指向同一对象,通过引用计数管理生命周期。
  • 特点
    • 引用计数为0时自动释放对象。
    • 支持自定义删除器。
    • 使用std::make_shared可合并内存分配(对象和控制块),提升性能。
  • 潜在问题
    • 循环引用:两个shared_ptr互相指向对方,导致内存泄漏(需用weak_ptr解决)。
  • 示例
    auto shared1 = std::make_shared<int>(42);
    std::shared_ptr<int> shared2 = shared1; // 引用计数+1

    3. ​**std::weak_ptr**

  • 作用:解决shared_ptr的循环引用问题,作为弱引用不增加引用计数。
  • 特点
    • 需通过lock()方法获取临时shared_ptr访问对象。
    • 不管理对象生命周期,仅观察资源是否存在。
  • 使用场景
    • 缓存、观察者模式、打破循环引用。
  • 示例
    std::weak_ptr<int> weak = shared1;
    if (auto temp = weak.lock()) { // 检查对象是否存活
        // 使用temp访问资源
    }

    5. ​自定义删除器

  • 用途:处理特殊资源释放(如文件句柄、数组)。
  • 示例
    // unique_ptr自定义删除器
    std::unique_ptr<int, void(*)(int*)> ptr(new int[5], [](int* p) { delete[] p; });
    
    // shared_ptr自定义删除器
    std::shared_ptr<int> arr(new int[5], [](int* p) { delete[] p; });

    使用注意事项

  • 避免裸指针混用:不要将同一裸指针交给多个智能指针管理。
  • 优先使用make_sharedmake_unique:提升性能并避免显式new
  • 循环引用:使用weak_ptr打破循环。
  • 线程安全
    • shared_ptr引用计数操作是原子的,但对象访问需额外同步。
    • 多线程中修改同一shared_ptr实例需加锁。
  • ​**unique_ptr**:轻量级,无额外开销,适合独占资源。
  • ​**shared_ptr**:引用计数有少量开销,适合共享资源。
  • ​**weak_ptr**:配合shared_ptr使用,避免循环引用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值