Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
C++ weak_ptr应用 循环引用解决方案_创想鸟

C++ weak_ptr应用 循环引用解决方案

使用weak_ptr可打破shared_ptr循环引用。当类A和B互相持有shared_ptr时,引用计数无法归零,导致内存泄漏;将B中对A的shared_ptr改为weak_ptr后,不增加引用计数,对象可正常析构,避免泄漏。

c++ weak_ptr应用 循环引用解决方案

在C++中使用

shared_ptr

管理对象生命周期时,容易因相互持有导致循环引用,使内存无法释放。weak_ptr正是为解决这一问题而设计的。它是一种弱引用指针,不增加引用计数,可用于观察

shared_ptr

所管理的对象是否还存在,从而打破循环。

循环引用问题示例

考虑两个类A和B,彼此持有对方的

shared_ptr

:

class B;
class A {
public:
std::shared_ptr ptr;
~A() { std::cout };

class B {
public:
std::shared_ptr ptr;
~B() { std::cout };

int main() {
auto a = std::make_shared();
auto b = std::make_shared();
a->ptr = b;
b->ptr = a;
}

此时a和b互相引用,引用计数始终不为0,析构函数不会被调用,造成内存泄漏。

使用weak_ptr打破循环

将其中一个方向的

shared_ptr

改为

weak_ptr

,即可打破循环。例如,让B持有A的弱引用:

立即学习“C++免费学习笔记(深入)”;

class B {
public:
std::weak_ptr ptr; // 改为weak_ptr
~B() { std::cout };

此时,A持有B的强引用,B持有A的弱引用。当main函数结束时,a的引用计数为1(来自main),b的引用计数也为1(来自main)。离开作用域后,a和b的引用计数归0,A先析构,随后B析构,资源正确释放。

weak_ptr的使用方法

由于

weak_ptr

不保证所指对象一定存在,访问前需检查:

使用

lock()

获取一个

shared_ptr

,若对象已释放则返回空指针 使用

expired()

判断对象是否已被释放(不推荐,存在竞态)

示例:

std::shared_ptr getA(std::weak_ptr& wp) {
if (auto sp = wp.lock()) {
return sp;
} else {
std::cout return nullptr;
}
}

适用场景总结

weak_ptr

常用于以下情况:

父子节点结构中,子节点用

weak_ptr

引用父节点 观察者模式中,避免观察者与被观察者相互强引用 缓存系统,避免缓存对象阻止资源释放 回调机制中,防止对象因回调引用无法析构

基本上就这些。只要在可能形成闭环的地方用

weak_ptr

替代其中一个

shared_ptr

,就能有效避免循环引用。关键是理解谁该拥有对象,谁只是临时访问。不复杂但容易忽略。

以上就是C++ weak_ptr应用 循环引用解决方案的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1473153.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
C++指针数组数组指针 声明语法解析
上一篇 2025年12月18日 20:12:01
C++注册模式 全局对象管理方案
下一篇 2025年12月18日 20:12:15

相关推荐

  • 怎么让豆包AI生成Python环境配置脚本

    怎么让豆包AI生成Python环境配置脚本怎么让豆包AI生成Python环境配置脚本怎么让豆包AI生成Python环境配置脚本怎么让豆包AI生成Python环境配置脚本

    想让豆包ai生成python环境配置脚本,首先要明确需求:操作系统、python版本、是否需要虚拟环境及具体依赖库和版本。1. 提前确定系统如ubuntu或macos;2. 指定python版本如3.10;3. 说明是否使用venv或conda;4. 列出所需库及版本如flask==2.3.0;5.…

    2026年10月2日 • 用户投稿
    000
  • 通过脚本使用认证方式控制 Shelly 设备

    通过脚本使用认证方式控制 Shelly 设备通过脚本使用认证方式控制 Shelly 设备通过脚本使用认证方式控制 Shelly 设备通过脚本使用认证方式控制 Shelly 设备

    本文介绍了如何通过 Shelly 脚本,在使用用户名和密码保护的 Shelly 设备上执行操作。核心在于利用 HTTP.Request 方法手动构建带有 Authorization: Basic 头的 HTTP 请求,从而绕过 HTTP.GET 方法无法传递认证信息的限制,并提供了详细的代码示例。 …

    2026年10月2日 • 用户投稿
    000
  • AnimaTensor— 吐司AI等推出的二次元图像生成模型

    AnimaTensor— 吐司AI等推出的二次元图像生成模型AnimaTensor— 吐司AI等推出的二次元图像生成模型AnimaTensor— 吐司AI等推出的二次元图像生成模型AnimaTensor— 吐司AI等推出的二次元图像生成模型

    AnimaTensor简介 animatensor是由cagliostrolab团队与tensorart联合开发的二次元图像生成模型。该模型采用了创新的v-prediction技术,通过预测图像生成过程中的“速度”来优化噪声调度和采样策略,从而提升图像质量和生成效率。animatensor分为两个版…

    2026年10月2日 • 用户投稿
    000
  • Java Stream中实现基于转换属性的条件过滤

    本文探讨了在Java Stream中,如何根据对象的某个映射属性进行过滤,同时又能保留原始对象的完整性。针对这一常见需求,文章详细介绍了Java 16及更高版本中Stream#mapMulti的强大用法,以及在旧版本Java中如何通过Stream#filter结合Lambda表达式高效实现,并分析了…

    2026年10月2日
    200
  • 《赛博朋克2077》官方再度修改主角V年龄设定

    《赛博朋克2077》官方再度修改主角V年龄设定《赛博朋克2077》官方再度修改主角V年龄设定《赛博朋克2077》官方再度修改主角V年龄设定《赛博朋克2077》官方再度修改主角V年龄设定

    在《赛博朋克2077》中,主角v是一个高度可定制的角色。玩家不仅可以自定义其外貌和背景故事,还能在游戏中为其做出关键的人生抉择。尽管v的设定较为完整,但其官方年龄却始终处于变动之中。 这并非指角色随着游戏时间推移而自然变老,而是因为开发商CD Projekt Red从未最终敲定V的确切年龄。游戏刚发…

    2026年10月2日 • 用户投稿
    100
  • 多语言开发场景下的插件组合推荐

    多语言开发场景下的插件组合推荐多语言开发场景下的插件组合推荐多语言开发场景下的插件组合推荐多语言开发场景下的插件组合推荐

    多语言开发效率提升的关键在于根据需求选择合适的插件组合。推荐如下:1. 代码编辑器/ide 插件:vs code 可选用 pylance、eslint 等语言支持类插件,intellij idea 对 java/kotlin 原生支持良好并兼容其他语言;2. 翻译类插件如彩云小译和 code tra…

    2026年10月2日 • 用户投稿
    100
  • 前端框架(React/Vue)的语法支持方案

    前端框架(React/Vue)的语法支持方案前端框架(React/Vue)的语法支持方案前端框架(React/Vue)的语法支持方案前端框架(React/Vue)的语法支持方案

    配置前端框架react/vue的语法支持方案主要围绕编辑器插件和构建工具配置展开。1. react推荐安装eslint和prettier插件实现代码检查与格式化,结合babel处理jsx及es6+语法,使用typescript时需配置tsconfig.json中的jsx选项为react;2. vue…

    2026年10月2日 • 用户投稿
    100
  • java使用教程如何读写本地文件内容 java使用教程的文件操作实用方法​

    java使用教程如何读写本地文件内容 java使用教程的文件操作实用方法​java使用教程如何读写本地文件内容 java使用教程的文件操作实用方法​java使用教程如何读写本地文件内容 java使用教程的文件操作实用方法​java使用教程如何读写本地文件内容 java使用教程的文件操作实用方法​

    读写本地文件的核心是正确使用java io流,根据文件类型选择合适的流类;2. 读取大型文本文件应使用bufferedreader结合readline()方法,并利用try-with-resources确保资源自动关闭,以提高效率和安全性;3. 处理不同编码格式文件时,需通过inputstreamr…

    2026年10月2日 • 用户投稿
    100
  • Node.js Workerpool 最佳实践:CPU密集型任务的资源管理策略

    Node.js Workerpool 最佳实践:CPU密集型任务的资源管理策略Node.js Workerpool 最佳实践:CPU密集型任务的资源管理策略Node.js Workerpool 最佳实践:CPU密集型任务的资源管理策略Node.js Workerpool 最佳实践:CPU密集型任务的资源管理策略

    本文探讨了在Node.js应用中高效管理CPU密集型任务的策略,特别是使用workerpool库时。核心观点是推荐使用一个单一的、集中管理的Worker Pool来处理所有不同类型的任务,而非为每种任务或路由创建独立的Pool。这种方法能有效避免资源过度竞争、优化CPU利用率,并简化资源管理,确保系…

    2026年10月2日 • 用户投稿
    000
  • 恶搞策略新作《Kingmakers》10月9日开放抢先测试:用枪炮爆杀中世纪!

    恶搞策略新作《Kingmakers》10月9日开放抢先测试:用枪炮爆杀中世纪!恶搞策略新作《Kingmakers》10月9日开放抢先测试:用枪炮爆杀中世纪!恶搞策略新作《Kingmakers》10月9日开放抢先测试:用枪炮爆杀中世纪!恶搞策略新作《Kingmakers》10月9日开放抢先测试:用枪炮爆杀中世纪!

    在去年2月,一款名为《kingmakers》的恶搞风格策略游戏发布了首支预告片,因其玩法中允许玩家使用ak47、装甲车乃至飞机大炮来碾压中世纪的“铁皮罐头”骑士,迅速被玩家们调侃为“骑马与开枪”。steam商店页面>>> 该游戏的抢先体验版本将于10月9日正式上线。近日,开发团队R…

    2026年10月2日 • 用户投稿
    100
  • java如何实现类之间的继承关系 java继承特性的应用操作指南

    java如何实现类之间的继承关系 java继承特性的应用操作指南java如何实现类之间的继承关系 java继承特性的应用操作指南java如何实现类之间的继承关系 java继承特性的应用操作指南java如何实现类之间的继承关系 java继承特性的应用操作指南

    java中实现类之间的继承关系,核心在于使用extends关键字,它允许子类继承父类的字段和方法,建立“is-a”关系,实现代码复用、多态性、扩展性和层次化设计;1. 使用extends关键字让子类继承父类,如class dog extends animal;2. 子类可通过super()调用父类构…

    2026年10月2日 • 用户投稿
    200
  • windows怎么恢复电源计划为默认值_电源计划恢复默认设置教程

    windows怎么恢复电源计划为默认值_电源计划恢复默认设置教程windows怎么恢复电源计划为默认值_电源计划恢复默认设置教程windows怎么恢复电源计划为默认值_电源计划恢复默认设置教程windows怎么恢复电源计划为默认值_电源计划恢复默认设置教程

    首先通过控制面板或命令提示符重置电源计划,默认设置可修复性能与续航问题,必要时使用系统还原回退至正常状态。 如果您发现Windows系统的电源计划设置混乱,导致设备性能或电池续航异常,可能是电源配置被修改所致。将电源计划恢复为默认值可以解决此类问题。 本文运行环境:Dell XPS 13,Windo…

    2026年10月2日 • 用户投稿
    100
  • java使用教程怎样实现基于TCP的网络通信 java使用教程的TCP编程入门技巧​

    java使用教程怎样实现基于TCP的网络通信 java使用教程的TCP编程入门技巧​java使用教程怎样实现基于TCP的网络通信 java使用教程的TCP编程入门技巧​java使用教程怎样实现基于TCP的网络通信 java使用教程的TCP编程入门技巧​java使用教程怎样实现基于TCP的网络通信 java使用教程的TCP编程入门技巧​

    java中实现tcp通信需编写服务器端和客户端代码,服务器使用serversocket监听端口并接受连接,客户端通过socket连接服务器,双方通过输入输出流交换数据,tcp确保可靠、有序传输。1. 服务器端创建serversocket绑定端口,调用accept()阻塞等待客户端连接,每接受一个连接…

    2026年10月2日 • 用户投稿
    100
  • 什么是LSM树?LSM树的层次结构

    什么是LSM树?LSM树的层次结构什么是LSM树?LSM树的层次结构什么是LSM树?LSM树的层次结构什么是LSM树?LSM树的层次结构

    lsm树通过将写入操作先缓存在内存的memtable中,再批量刷新到磁盘的sstables,并利用多层级结构和compaction机制,将随机写转化为顺序写,显著提升写入性能;其层次结构由内存中的memtable和immutable memtable,以及磁盘上分层的sstables组成,l0层允许…

    2026年10月2日 • 用户投稿
    000
  • 《赛博朋克2》或将加入在线模式 CDPR正招网络工程师!

    《赛博朋克2》或将加入在线模式 CDPR正招网络工程师!《赛博朋克2》或将加入在线模式 CDPR正招网络工程师!《赛博朋克2》或将加入在线模式 CDPR正招网络工程师!《赛博朋克2》或将加入在线模式 CDPR正招网络工程师!

    近日,外媒thegamer披露,《赛博朋克2》或将引入在线玩法。据cd projekt red最新发布的招聘信息显示,工作室正在招募一名首席网络工程师,为该项目搭建核心网络系统。 该职位的职责包括“设计并实现网络架构与在线功能”,同时确保玩家能够享受“低延迟、高稳定性的联网体验”。这一技术需求强烈暗…

    2026年10月2日 • 用户投稿
    400
  • Selenium Grid 4:指定节点运行测试用例

    Selenium Grid 4:指定节点运行测试用例Selenium Grid 4:指定节点运行测试用例Selenium Grid 4:指定节点运行测试用例Selenium Grid 4:指定节点运行测试用例

    本文旨在指导初学者如何在 Selenium Grid 4 环境中,通过配置节点和代码,实现将测试用例定向到特定节点运行。通过设置自定义 Capabilities,您可以精确控制测试执行的节点,从而满足特定测试需求,例如在特定版本的浏览器或特定操作系统上进行测试。 Selenium Grid 4 指定…

    2026年10月2日 • 用户投稿
    000
  • JS中的循环怎么使用

    JS中的循环怎么使用JS中的循环怎么使用JS中的循环怎么使用JS中的循环怎么使用

    JS中的循环主要用于重复执行一段代码,直到满足特定条件为止。 掌握它们对于处理数组、对象以及执行重复性任务至关重要。 解决方案 JavaScript 提供了几种循环结构,各有用途: for 循环: 这是最常用的循环之一,尤其适用于已知循环次数的情况。 for (let i = 0; i < 1…

    2026年10月2日 • 用户投稿
    100
  • Android ImageView 基于锚点的缩放实现

    Android ImageView 基于锚点的缩放实现Android ImageView 基于锚点的缩放实现Android ImageView 基于锚点的缩放实现Android ImageView 基于锚点的缩放实现

    本文介绍了如何在 Android 应用中实现 ImageView 基于四个角锚点的缩放功能。通过监听触摸事件,计算触摸点与 ImageView 中心点的距离,并根据距离变化动态调整 ImageView 的缩放比例,从而实现拖动锚点进行缩放的效果。文章提供了详细的代码示例,帮助开发者理解和实现该功能。…

    2026年10月2日 • 用户投稿
    200
  • PHP文件上传系统:如何通过外键将文件精确关联到特定用户

    本教程详细阐述如何在PHP文件上传系统中,通过引入数据库外键(user_id)将上传的QR码图片与特定用户关联。内容涵盖数据库表结构设计、前端表单改造、后端文件处理逻辑及用户专属内容展示,确保文件上传的精确归属和管理。 1. 理解核心问题与解决方案 在多用户或多角色(如员工为用户上传)的应用场景中,…

    2026年10月2日
    100
  • java使用教程怎样进行java程序的性能调优 java使用教程的性能优化实用技巧​

    java使用教程怎样进行java程序的性能调优 java使用教程的性能优化实用技巧​java使用教程怎样进行java程序的性能调优 java使用教程的性能优化实用技巧​java使用教程怎样进行java程序的性能调优 java使用教程的性能优化实用技巧​java使用教程怎样进行java程序的性能调优 java使用教程的性能优化实用技巧​

    java性能瓶颈常见于cpu密集型操作、内存与gc问题、i/o阻塞及数据库慢查询;2. 提升性能需从jvm调优(如选择g1/zgc、合理设置堆大小)、代码优化(高效算法、减少对象创建、并发工具使用)、外部依赖优化(数据库索引、缓存、消息队列)入手;3. 避免内存泄漏需注意静态集合管理、监听器注销、t…

    2026年10月2日 • 用户投稿
    200

发表回复

登录后才能评论
关注微信