C++11 几种智能指针的介绍、各种用法-初解

众所周知,C++11引入了几种智能指针。

针对智能指针,我们一起来了解一下吧~有问题可评论区一起讨论。。。。。

一、首先,引入智能指针的目的?

        用来管理动态分配的内存。很多动态分配的内存由智能指针进行自动管理,这也就不需要开发人员显式的再delete,防止内存泄漏。

二、有哪几种智能指针?

        C++中引入了三种主要的智能指针,它们分别是std::shared_ptrstd::unique_ptrstd::weak_ptr

        以下是它们的具体介绍:

  1. std::shared_ptr

    • 共享所有权的智能指针,多个std::shared_ptr可以同时拥有同一块内存资源。
    • 通过引用计数来管理内存资源的生命周期。
    • 可以通过std::make_shared来创建std::shared_ptr对象。
    • 可以通过std::shared_ptr的复制构造函数来实现拷贝。
    • 当引用计数为0时,资源被自动释放。
  2. std::unique_ptr

    • 独占所有权的智能指针,每个std::unique_ptr只能拥有一块内存资源。
    • 通过移动语义来管理内存资源的所有权。
    • 不能进行拷贝,但可以通过移动进行所有权转移。
    • std::unique_ptr超出作用域时,资源会被自动释放。
  3. std::weak_ptr

    • 弱引用的智能指针,它不会增加内存资源的引用计数。
    • 用于解决std::shared_ptr的循环引用问题。
    • 可以通过std::weak_ptrlock()方法将其转换为std::shared_ptr来访问资源。
    • std::shared_ptr释放资源后,对应的std::weak_ptr会自动失效。

        通过这三种智能指针,C++提供了不同的所有权管理方式,使得内存的动态分配和释放更加方便和安全。开发者可以根据实际的需求和情况选择使用适合的智能指针。

三、智能指针的各自用法?

  1. std::shared_ptr是一种共享所有权的智能指针。多个std::shared_ptr对象可以共享对同一块内存的所有权。它适用于需要多个对象共同拥有同一资源的情况。可以使用std::make_shared函数来创建std::shared_ptr对象。

    示例:

    // 创建一个 shared_ptr
    std::shared_ptr<int> sharedPtr = std::make_shared<int>(10);
    
    // 使用 shared_ptr
    std::cout << *sharedPtr << std::endl;
    
  2. std::unique_ptr是一种独占所有权的智能指针。它只能有一个指针拥有对特定资源的所有权,因此不可以拷贝,只可以移动。它适用于需要独占某个资源并在生命周期结束后自动释放的情况。

    示例:

    // 创建一个 unique_ptr
    std::unique_ptr<int> uniquePtr = std::make_unique<int>(5);
    
    // 使用 unique_ptr
    std::cout << *uniquePtr << std::endl;
    
  3. std::weak_ptr是一种弱引用的智能指针,它不会增加资源的引用计数。主要用于解决std::shared_ptr的循环引用问题。可以通过调用std::weak_ptrlock()方法,将其转换为std::shared_ptr以访问资源。

    示例:

    // 创建一个 shared_ptr 和 weak_ptr
    std::shared_ptr<int> sharedPtr = std::make_shared<int>(20);
    std::weak_ptr<int> weakPtr = sharedPtr;
    
    // 使用 weak_ptr
    if (auto shared = weakPtr.lock()) {
        std::cout << *shared << std::endl;
    } else {
        std::cout << "shared_ptr is expired" << std::endl;
    }
    

        以上是几种智能指针的简单用法,它们都在C++中提供了更安全和方便的动态内存管理机制。根据实际情况,选择适合的智能指针可以有效避免内存泄漏和悬空指针等问题。   

        以上主要查问的ChatGPT,有好的见解可以在评论区附言或链接,感谢~~~~~~~ღ( ´・ᴗ・` )

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值