C++之weak_ptr与shared_ptr智能指针实例(一百九十五)

这篇具有很好参考价值的文章主要介绍了C++之weak_ptr与shared_ptr智能指针实例(一百九十五)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

C++之weak_ptr与shared_ptr智能指针实例(一百九十五),C++入门系列,c++,开发语言

1.前言

本篇目的:C++之weak_ptr与shared_ptr强弱智能指针用法

在C++中,weak_ptr和shared_ptr是智能指针的两种类型,用于解决资源管理和避免内存泄漏的问题。

  1. shared_ptr(共享指针):

    • shared_ptr允许多个智能指针共享同一个对象的所有权。
    • 每个shared_ptr都维护一个引用计数,它记录有多少个shared_ptr指向同一对象。
    • 只有当引用计数变为0时,shared_ptr才会自动析构并释放资源。
    • 可以通过std::make_shared或std::shared_ptr构造函数来创建shared_ptr对象。
  2. weak_ptr(弱指针):

    • weak_ptr是一种不控制对象生命周期的智能指针,它指向一个由shared_ptr管理的对象。
    • weak_ptr可以观测shared_ptr的生命周期,但不会增加引用计数。
    • 使用lock()函数可以获取一个有效的shared_ptr对象来访问观测的资源。
    • 如果shared_ptr已经释放了资源,则lock()函数会返回一个空的shared_ptr。

使用shared_ptr的好处:

  • 避免内存泄漏:通过引用计数,当没有shared_ptr指向对象时,会自动进行资源释放。
  • 安全共享对象:多个shared_ptr可以共享访问同一个对象,不会出现多次释放同一资源的问题。

使用weak_ptr的好处:

  • 避免循环引用:当对象之间存在互相引用而没有外部引用时,使用weak_ptr作为其中一个引用可以打破循环引用,避免内存泄漏。
  • 安全观测资源:通过lock()函数,可以安全地观测shared_ptr所管理的对象,避免悬空指针的问题。

需要注意的是,当使用weak_ptr时,需要注意判断返回的shared_ptr是否为空,以处理shared_ptr已释放资源的情况。另外,weak_ptr并不拥有指向的资源,因此不能直接通过weak_ptr访问资源的成员函数或成员变量,需要使用lock()函数获取shared_ptr对象后才能进行访问。

在C++中,std::weak_ptr类提供了一个成员函数lock(),用于获取与其关联的std::shared_ptr对象。

lock()函数的实现如下:

template<class T>
std::shared_ptr<T> std::weak_ptr<T>::lock() const noexcept;

lock()函数的作用是尝试获取与std::weak_ptr对象关联的std::shared_ptr对象。如果关联的std::shared_ptr对象仍然存在,lock()函数会返回一个有效的、指向相同目标的std::shared_ptr对象。如果关联的std::shared_ptr已被销毁,lock()函数将返回一个空指针(nullptr)。

lock()函数是线程安全的,并且在多线程环境中可以正确地处理std::shared_ptr的引用计数和资源管理。

使用lock()函数可以安全地访问由std::weak_ptr进行观测的对象,避免了悬空指针的风险,同时也不会增加引用计数。

2.应用实例

#include <iostream>
#include <memory>
#include <string>

using namespace std;

class C2ComponentStore {
public:
  C2ComponentStore() {}
  ~C2ComponentStore() {}

  string name = "123456789";
};

int main() {
  //1.创建一个weak_ptr对象platformStore,初始为空
  std::weak_ptr<C2ComponentStore> platformStore;
  //2.通过lock()函数获取platformStore的shared_ptr对象
  std::shared_ptr<C2ComponentStore> store = platformStore.lock();


  //3.如果获取的shared_ptr对象为空
  if(store == nullptr) {
    //4.创建一个新的shared_ptr对象store,并使用make_shared初始化
    store = std::make_shared<C2ComponentStore>();

    //5.将store赋值给platformStore
    platformStore = store;
  }

  printf("store.name = %s\n",store->name.c_str());
  printf("platformStore.name = %s\n",platformStore.lock()->name.c_str());

  return 0;
}

以上代码中,platformStore.lock()的调用将尝试获取与platformStore关联的std::shared_ptr对象。如果对象仍然有效,那么返回的std::shared_ptr对象是有效的,可以使用它来访问对象的成员变量和方法。如果对象已被销毁,那么返回的std::shared_ptr对象将是一个空指针。文章来源地址https://www.toymoban.com/news/detail-708299.html

到了这里,关于C++之weak_ptr与shared_ptr智能指针实例(一百九十五)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++智能指针shared_ptr用法

    写在前面的总结: 一个shared_ptr对象管理一个指针(new T,在堆空间),多个shared_ptr对象可以管理同一个指针,只有某个shared_ptr对象第一次初始化指针时才执行指针的构造函数,管理同一个指针的shared_ptr对象个数称为引用计数,这个引用计数保存在每个管理该指针的shared_p

    2024年02月03日
    浏览(46)
  • C++智能指针shared_ptr详解

    C++智能指针shared_ptr是一种可以自动管理内存的智能指针,它是C++11新增的特性之一。与传统指针不同,shared_ptr可以自动释放所管理的动态分配对象的内存,并避免了手动释放内存的繁琐操作,从而减少了内存泄漏和野指针的出现。 shared_ptr是一个模板类,通过引用计数器实现

    2023年04月22日
    浏览(28)
  • C++智能指针shared_ptr使用详解

    shared_ptr 是一个共享所有权的智能指针,允许多个指针指向同一个对象。 ​ shared_ptr 使用 引用计数 ,每一个shared_ptr的拷贝都指向相同的内存。每使用它一次,内部的引用计数加1,每析构一次,内部的引用计数减1,减为0时,释放所指向的堆内存。shared_ptr内部的引用计数是安

    2024年02月07日
    浏览(31)
  • 【C++入门到精通】智能指针 shared_ptr 简介及C++模拟实现 [ C++入门 ]

    在 C++ 动态内存管理中,除了 auto_ptr 和 unique_ptr 之外,还有一种 智能指针 shared_ptr ,它可以让多个指针共享同一个动态资源,并且能够自动释放资源。 shared_ptr 通过引用计数的方式来管理内存,能够避免程序中出现悬空指针和内存泄漏等问题 。本文将介绍 shared_ptr 的简介和

    2024年01月22日
    浏览(36)
  • 智能指针shared_ptr

    shared_ptr共享它指向的对象,内部采用计数机制来实现。当新的shared_ptr与对象关联时,引用计数加1;当shared_ptr超出作用域时,引用计数减1;当引用计数为0时,释放该对象; shared_ptrA p0 = std::make_sharedA(\\\"西红柿\\\");//C++11提供 重载了*和-操作符,可以像使用指针一样使用shared_ptr

    2023年04月23日
    浏览(30)
  • 深入理解和应用C++ std::shared_ptr别名构造函数

    在现代C++中,智能指针是一个极为重要的工具,尤其std::shared_ptr以其自动内存管理、引用计数和多线程安全性等特性深受开发者喜爱。其中一个不太常用但功能强大的构造方式是 别名构造函数 ,它允许我们创建一个共享相同底层对象但是指向其内部不同数据成员或子对象的

    2024年01月16日
    浏览(33)
  • shared_ptr和unique_ptr主动释放

    shared_ptr和unique_ptr均可以采用reset()来进行释放,unique_ptr调用了reset之后就会直接释放掉,shared_ptr则会在所有引用计数变为0的时候才会释放申请的内存。 注意unique_ptr的release()方法,并不会释放资源,只会把unique_ptr置为空指针,原来那个资源可以继续调用 reset 结果: 在reset之

    2024年02月14日
    浏览(26)
  • 论 shared_ptr的线程安全

    今天有同事问我shared_ptr是线程更安全的吗?我当时脑子一懵,有点不确定。 但回过神来仔细一想这什么鸟问题,c++ stl里有线程安全的吗,shared_ptr 也不是针对线程安全而设计出来的呀,八竿子打不着的东西为什么会凑在一起问。 好像也就一个atmoic引用计数可以沾上边。 首先

    2024年02月08日
    浏览(27)
  • 【C++入门到精通】智能指针 auto_ptr、unique_ptr简介及C++模拟实现 [ C++入门 ]

    在 C++ 中,智能指针是一种非常重要的概念,它能够帮助我们自动管理动态分配的内存,避免出现内存泄漏等问题。在上一篇文章中,我们了解了智能指针的基本概念和原理, 本篇文章将继续介绍 auto_ptr 和 unique_ptr 两种智能指针的概念及其在 C++ 中的模拟实现 。通过学习这些

    2024年01月19日
    浏览(51)
  • 【C++】auto_ptr为何被唾弃?以及其他智能指针的学习

    搭配异常可以让异常的代码更简洁 文章目录 智能指针     内存泄漏的危害     1.auto_ptr(非常不建议使用)     2.unique_ptr     3.shared_ptr     4.weak_ptr 总结 C++中为什么会需要智能指针呢?下面我们看一下样例:  在上面的代码中,一旦出现异常那就会造成内存泄漏,什么是内存

    2024年02月11日
    浏览(22)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包