当前位置: 首页 > news >正文

建设银行网站的目的是什么wordpress go跳转

建设银行网站的目的是什么,wordpress go跳转,最新网页版传奇游戏,直播视频软件阅读导航 引言一、std::shared_ptr的循环引用1. 概念2. 示例分析 二、std::weak_ptr1. 简介2. weak_ptr模板类提供的成员方法3. 使用示例#xff08;1#xff09;weak_ptr指针的创建#xff08;2#xff09;完整示例#xff08;解决上面循环引用问题#xff09; 4. C模拟… 阅读导航 引言一、std::shared_ptr的循环引用1. 概念2. 示例分析 二、std::weak_ptr1. 简介2. weak_ptr模板类提供的成员方法3. 使用示例1weak_ptr指针的创建2完整示例解决上面循环引用问题 4. C模拟实现 温馨提示 引言 欢迎阅读本系列文章的第二篇我们将继续探讨与 shared_ptr 相关的主题。上一篇文章我们介绍了 shared_ptr 的强大功能但也提到了它可能面临的一个问题 —— 循环引用。当两个或多个对象之间相互持有 shared_ptr 的引用时就会形成循环引用导致这些对象无法被正确释放从而引发内存泄漏。 在本文中我们将深入讨论循环引用问题并引入另一个智能指针类——weak_ptr。weak_ptr 是 shared_ptr 的伙伴它可以帮助我们解决循环引用问题并且不会增加引用计数以避免对象无法释放的情况。 通过学习 shared_ptr 和 weak_ptr 的组合使用我们将能够更好地管理动态分配的对象避免内存泄漏并提高代码的健壮性和可维护性。敬请期待本文的剖析和示例希望能给您带来更深入的了解和实践经验。 一、std::shared_ptr的循环引用 1. 概念 当使用 std::shared_ptr 时循环引用是一种常见的问题。循环引用指的是两个或多个对象彼此持有 shared_ptr 的引用形成一个环状依赖关系。这种情况下即使没有外部引用指向这些对象它们的引用计数也无法降为零从而导致内存泄漏。 循环引用可能会导致内存泄漏的发生因为每个对象都会持有对其他对象的引用导致它们的引用计数无法归零。当没有外部引用指向这些对象时它们的析构函数不会被调用从而导致资源无法正确释放。 2. 示例分析 首先我们来看一段代码这段代码就明显存在着循环引用。 struct ListNode {int _data;shared_ptrListNode _prev;shared_ptrListNode _next;~ListNode(){ cout ~ListNode() endl; } }; int main() {shared_ptrListNode node1(new ListNode);shared_ptrListNode node2(new ListNode);cout node1.use_count() endl;cout node2.use_count() endl;node1-_next node2;node2-_prev node1;cout node1.use_count() endl;cout node2.use_count() endl;return 0; }✅循环引用分析 node1和node2两个智能指针对象指向两个节点引用计数变成1我们不需要手动delete。node1的_next指向node2node2的_prev指向node1引用计数变成2。node1和node2析构引用计数减到1但是_next还指向下一个节点。但是_prev还指向上一个节点。也就是说_next析构了node2就释放了。也就是说_prev析构了node1就释放了。但是_next属于node的成员node1释放了_next才会析构而node1由_prev管理_prev属于node2成员所以这就叫循环引用谁也不会释放。 ⭕让我们通过下面这个图片来说上面这个问题 为了解决循环引用问题可以使用 std::weak_ptr。std::weak_ptr 是一种弱引用它可以指向 std::shared_ptr 持有的对象但不会增加对象的引用计数。这样即使存在循环引用通过使用 std::weak_ptr 可以打破循环引用使对象的引用计数能够正确降为零从而触发析构函数的调用。 二、std::weak_ptr 1. 简介 std::weak_ptr 是 C11 标准库中提供的一种弱引用智能指针它可以指向 std::shared_ptr 所管理的对象但不会增加对象的引用计数。因此当使用 std::weak_ptr 时如果 std::shared_ptr 对象被释放或者过期std::weak_ptr 将自动失效避免了循环引用导致的内存泄漏问题。 std::weak_ptr官方文档 2. weak_ptr模板类提供的成员方法 和 shared_ptrT、unique_ptrT 相比weak_ptrT 模板类提供的成员方法不多下表罗列了常用的成员方法及各自的功能。 成员方法功能operator重载 赋值运算符使得 std::weak_ptr 指针可以直接被 std::weak_ptr 或者 std::shared_ptr 类型指针赋值。swap(x)其中 x 表示一个同类型的 std::weak_ptr 类型指针该函数可以互换两个同类型 std::weak_ptr 指针的内容。reset()将当前 std::weak_ptr 指针置为空指针。use_count()查看指向和当前 std::weak_ptr 指针相同的 std::shared_ptr 指针的数量。expired()判断当前 std::weak_ptr 指针是否过期指针为空或者指向的堆内存已经被释放。lock()如果当前 std::weak_ptr 已经过期则该函数会返回一个空的 std::shared_ptr 指针反之该函数返回一个和当前 std::weak_ptr 指向相同的 std::shared_ptr 指针。 注意weak_ptrT 模板类没有重载 * 和 - 运算符因此 weak_ptr 类型指针只能访问某一 shared_ptr 指针指向的堆内存空间无法对其进行修改。 3. 使用示例 1weak_ptr指针的创建 创建 std::weak_ptr 指针的方式和创建 std::shared_ptr 的方式类似。下面列举了三种常见的创建 std::weak_ptr 的方式 从 std::shared_ptr 创建 可以通过将 std::shared_ptr 赋值给 std::weak_ptr 来创建一个弱引用指针例如 std::shared_ptrint sptr std::make_sharedint(42); std::weak_ptrint wptr(sptr);上述代码中我们首先创建了一个 std::shared_ptr 对象 sptr它指向一个动态分配的 int 类型对象。然后我们将 sptr 赋值给 std::weak_ptr 对象 wptr创建了一个弱引用指针。 从 std::shared_ptr 转换 可以通过 std::shared_ptr 的 weak_ptr 成员函数将 std::shared_ptr 转换为 std::weak_ptr例如 std::shared_ptrint sptr std::make_sharedint(42); std::weak_ptrint wptr sptr-weak_ptr();上述代码中我们首先创建了一个 std::shared_ptr 对象 sptr它指向一个动态分配的 int 类型对象。然后我们调用 sptr 的 weak_ptr() 成员函数将 sptr 转换为 std::weak_ptr 对象 wptr创建了一个弱引用指针。 使用 std::weak_ptr 的构造函数 可以直接使用 std::weak_ptr 的构造函数创建一个空的弱引用指针例如 std::weak_ptrint wptr;上述代码中我们直接创建了一个空的 std::weak_ptr 对象 wptr它不持有任何对象的引用。 2完整示例解决上面循环引用问题 使用 std::weak_ptr 修改上面的代码可以将 _prev 和 _next 成员变量改为 std::weak_ptrListNode 类型。这样可以避免循环引用同时仍然可以访问链表中的前一个节点和后一个节点 struct ListNode {int _data;weak_ptrListNode _prev;weak_ptrListNode _next;~ListNode() { cout ~ListNode() endl; } };int main() {shared_ptrListNode node1(new ListNode);shared_ptrListNode node2(new ListNode);cout node1.use_count() endl;cout node2.use_count() endl;node1-_next node2;node2-_prev node1;cout node1.use_count() endl;cout node2.use_count() endl;// 使用 weak_ptr.lock() 获取 shared_ptr 对象shared_ptrListNode node1Next node1-_next.lock();shared_ptrListNode node2Prev node2-_prev.lock();if (node1Next)cout node1 next data: node1Next-_data endl;elsecout node1 next is nullptr endl;if (node2Prev)cout node2 prev data: node2Prev-_data endl;elsecout node2 prev is nullptr endl;return 0; } 运行上述代码可以得到如下输出 1 1 2 2 node1 next data: 0 node2 prev data: 0在上面的代码示例中我们创建了两个节点 node1 和 node2并通过 std::weak_ptr 进行相互引用。 shared_ptrListNode node1(new ListNode); shared_ptrListNode node2(new ListNode);接下来我们设置节点之间的关系。修改前的代码如下 node1-_next node2; node2-_prev node1;我们将 _next 和 _prev 成员变量的类型从 shared_ptrListNode 改为 weak_ptrListNode weak_ptrListNode _prev; weak_ptrListNode _next;这样就建立了节点之间的弱引用关系避免了循环引用。 接下来我们可以通过 lock() 方法将 std::weak_ptr 转换为 std::shared_ptr以访问所管理的对象。 shared_ptrListNode node1Next node1-_next.lock(); shared_ptrListNode node2Prev node2-_prev.lock();如果 std::weak_ptr 不过期即所管理的对象还存在lock() 方法会返回一个有效的 std::shared_ptr 对象否则返回空指针。 最后我们可以使用这些 std::shared_ptr 对象来访问链表中的前驱和后继节点的数据。 if (node1Next)cout node1 next data: node1Next-_data endl; elsecout node1 next is nullptr endl;if (node2Prev)cout node2 prev data: node2Prev-_data endl; elsecout node2 prev is nullptr endl;通过这种方式我们可以安全地访问链表中的前驱和后继节点而不会导致循环引用和内存泄漏。 4. C模拟实现 templateclass T class weak_ptr { public:// 默认构造函数将_ptr成员指针初始化为nullptrweak_ptr():_ptr(nullptr){}// 接受shared_ptr参数的构造函数将_ptr成员指针初始化为shared_ptr所管理对象的指针weak_ptr(const shared_ptrT sp):_ptr(sp.get()){}// 重载*运算符返回所管理对象的引用T operator*(){return *_ptr;}// 重载-运算符返回所管理对象的指针T* operator-(){return _ptr;}// 返回所管理对象的指针T* get(){return _ptr;}private:T* _ptr; // 所管理对象的指针 };这段代码是一个简化版的 weak_ptr 类的实现提供了一些基本的功能。 首先我们可以看到 weak_ptr 类有一个默认构造函数和一个接受 shared_ptr 参数的构造函数。默认构造函数将 _ptr 成员指针初始化为 nullptr而接受 shared_ptr 参数的构造函数将 _ptr 成员指针初始化为 shared_ptr 所管理对象的指针。 接下来我们可以看到 weak_ptr 重载了 * 和 - 运算符使得可以像使用指针一样通过 weak_ptr 对象访问所管理的对象。operator*() 返回所管理对象的引用operator-() 返回所管理对象的指针。 同时weak_ptr 还提供了一个 get() 方法返回 _ptr 指针即所管理对象的指针。这允许用户直接访问 _ptr 指针但需要注意这种直接访问可能会导致悬空指针问题因为 _ptr 指针可能已经无效所管理对象已被释放。 注意这个简化版的 weak_ptr 实现没有考虑线程安全性。在实际应用中weak_ptr 需要与其他智能指针共同使用比如 shared_ptr、unique_ptr并且需要考虑线程安全性和异常安全性。 温馨提示 感谢您对博主文章的关注与支持另外我计划在未来的更新中持续探讨与本文相关的内容会为您带来更多关于C以及编程技术问题的深入解析、应用案例和趣味玩法等。请继续关注博主的更新不要错过任何精彩内容 再次感谢您的支持和关注。期待与您建立更紧密的互动共同探索C、算法和编程的奥秘。祝您生活愉快排便顺畅
http://www.pierceye.com/news/180176/

相关文章:

  • 网站灰色 代码深圳的深圳的网站建设公司
  • 做电影采集网站需要多大vps安徽建设新工程信息网站
  • 中小企业网站制作化工厂网站建设
  • 电子政务网站建设出版社百度网页提交入口
  • 专业柳州网站建设哪家便宜淄博桓台网站建设定制
  • 网站建设投标标书企业网站建设销售前景
  • wordpress建站教程凌风wordpress 仪表盘 慢
  • 怎样给网站或者商品做推广关于建网站新闻
  • 上海 微信网站 建站一对一直播app
  • ppt模板免费下载网站哪个好克拉玛依市住房和建设局网站
  • 制作网站得多少钱交互设计留学
  • 理财网站免费建设经典重庆新闻论坛
  • 南京专业网站制作哪家好企业所得税交多少
  • 广西网站建设哪家好常熟做网站的
  • 礼品网站制作辽宁省建设部网站
  • 网站群的建设目标澧县网页设计
  • 邯郸网站建设在哪里网站建设yingkagou
  • 姜堰区网站建设企业公司网站制作
  • 目前做的比较好的法律网站有哪些兰州seo技术优化排名公司
  • wordpress网站接入qqwordpress调用二级分类目录
  • 自建站有哪些站点soho 网站建设
  • cms网站建设如果在网上接网站建设项目
  • 建设网站的重点与难点在于社区网站模版
  • 自己在线制作logo免费网站公司网页设计教程
  • 广西城乡建设网站一家企业如何做网站推广
  • 小程序可以做网站吗wordpress 活动插件
  • 深圳网站建设流程图货代网站制作
  • 建设一个网站需要什么技术人员在线音乐网站开发
  • 做现货黄金看什么网站网络服务商怎么查询
  • 英语作文网站紫色个人网站模板