Weak_ptr 如何知道共享资源已过期?

2023-11-21

考虑以下代码:

#include <memory>
#include <iostream>

using namespace std;

struct MySharedStruct
{
  int i;
};

void print_value_of_i(weak_ptr<MySharedStruct> weakPtr)
{
  if (shared_ptr<MySharedStruct> sp = weakPtr.lock())
  { cout << "Value of i = " << sp->i << endl; }
  else
  { cout << "Resource has expired"; }
}

int main()
{
  shared_ptr<MySharedStruct> sharedPtr(new MySharedStruct() );
  sharedPtr->i = 5;

  weak_ptr<MySharedStruct> weakPtr;
  weakPtr = sharedPtr;

  print_value_of_i(weakPtr);

  sharedPtr.reset(new MySharedStruct() ); // <<----- How does weak_ptr know it has expired after this line executes?
  sharedPtr->i = 10;

  print_value_of_i(weakPtr);

  return 0;
}

如何weak_ptr考虑到资源,它已经过期shared_ptr引用是否基本上已被其他资源取代?什么是weak_ptr跟踪并确定old共享资源被销毁并被替换new共享资源?方法的示例定义(如果相关)lock in weak_ptr将不胜感激。


当a时分配的控制块shared_ptr从一个普通指针创建,该指针包含对象的引用计数器和指向对象本身的指针以及自定义删除器对象(如果有)。当引用计数器达到零时,对象被释放并将指针设置为空。因此,当对象引用计数器为零时,意味着该对象消失了。

对于 x86 和 x86-64,它们使用原子操作并且没有显式锁定(没有互斥锁或自旋锁)。实现的技巧是一个特殊的无锁(忙自旋的代码语言)函数atomic_conditional_increment仅当对象引用计数器不为零时才递增。它用于实现weak_ptr::lock当多个线程尝试创建一个线程时,函数可以应对竞争shared_ptr来自同一个weak_ptr对象引用计数器为零。看http://www.boost.org/doc/libs/1_52_0/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp

控制块本身在之间共享shared_ptr's and weak_ptr并为其自身提供了另一个引用计数器,以便它保持活动状态,直到释放对它的最后一个引用。

When a shared_ptr被重新分配它指向另一个控制块,因此控制块仅指向一个相同的对象。换句话说,控制块中的一个对象不会被另一个对象替换。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Weak_ptr 如何知道共享资源已过期? 的相关文章

  • ROWNUM 的 OracleType 是什么

    我试图参数化所有现有的 sql 但以下代码给了我一个问题 command CommandText String Format SELECT FROM 0 WHERE ROWNUM lt maxRecords command CommandT
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • fgets() 和 Ctrl+D,三次才能结束?

    I don t understand why I need press Ctrl D for three times to send the EOF In addition if I press Enter then it only too
  • 使用 Google Analytics API 在 C# 中显示信息

    我一整天都在寻找一个好的解决方案 但谷歌发展得太快了 我找不到有效的解决方案 我想做的是 我有一个 Web 应用程序 它有一个管理部分 用户需要登录才能查看信息 在本节中 我想显示来自 GA 的一些数据 例如某些特定网址的综合浏览量 因为我
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • c# Asp.NET MVC 使用FileStreamResult下载excel文件

    我需要构建一个方法 它将接收模型 从中构建excel 构建和接收部分完成没有问题 然后使用内存流导出 让用户下载它 不将其保存在服务器上 我是 ASP NET 和 MVC 的新手 所以我找到了指南并将其构建为教程项目 public File
  • 当 Cortex-M3 出现硬故障时如何保留堆栈跟踪?

    使用以下设置 基于 Cortex M3 的 C gcc arm 交叉工具链 https launchpad net gcc arm embedded 使用 C 和 C FreeRtos 7 5 3 日食月神 Segger Jlink 与 J
  • .Net Core / 控制台应用程序 / 配置 / XML

    我第一次尝试使用新的 ConfigurationBuilder 和选项模式进入 Net Core 库 这里有很多很好的例子 https docs asp net en latest fundamentals configuration ht
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • 将应用程序从 Microsoft Access 迁移到 VB 或 C#.NET

    我目前正试图说服管理层需要将我们的应用程序之一移植到 NET 该应用程序已经发展成为 Access 中的一个庞然大物 SQL 后端 拥有 700 个链接表 650 个表单 子表单 130 个模块和 850 个查询 我几乎知道这样做的所有主要
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • 具有两个标题行的表排序器

    我正在使用表排序器 jquery 插件我的表格标题中有两行 有什么方法可以在我的表上启用排序吗 它应该能够按第二个标题行排序 第一个标题行只是按日期对相关数据进行分组 如果使用此插件不可能做到这一点 也许有人有解决方法的建议 这是我的表格标
  • SQL Server 上的 varbinary 到 string

    如何将列值转换为varbinary max to varchar以人类可读的形式 以下表达式对我有用 SELECT CONVERT VARCHAR 1000 varbinary value 2 Here有关样式选择的更多详细信息 第三个参数
  • 检查是否从 iOS 设备访问 PHP 页面

    我有一个简单的 PHP 网页 并且希望返回不同的内容 具体取决于它是从 iPhone iPad 还是从网络浏览器访问 我怎样才能做到这一点 使用来自的用户代理 SERVER HTTP USER AGENT 对于简单的检测 您可以使用this
  • 如何检查网站上的值是否已更改

    基本上 如果网站上的值发生变化 我会尝试运行一些代码 Python 3 2 否则稍等一下 稍后再检查 首先 我认为我可以将值保存在变量中 并将其与下次运行脚本时获取的新值进行比较 但这很快就遇到了问题 因为当脚本再次运行并初始化该变量时 该
  • jquery ctrl+enter 作为在文本区域中输入

    I am trying to reproduce standard instant messenger behavior on TEXT area control enter works as send button ctrl enter
  • 如何在不使用更新数据库的情况下生成启用了迁移的 EF6 数据库?

    在 EF5 中 我依赖于这样一个事实 我可以使用以下命令从模型重新创建数据库Database CreateIfNotExists 我会根据需要生成迁移 但永远不会将它们签入源代码管理 因为它们往往是开发周期的工件 然后每个开发人员都会根据需
  • iTextSharp - 在电子邮件附件中发送内存中的 pdf

    我在这里问了几个问题 但仍然遇到问题 如果您能告诉我我的代码中做错了什么 我将不胜感激 我从 ASP Net 页面运行上面的代码并得到 无法访问关闭的流 var doc new Document MemoryStream memoryStr
  • 字符串数组长度显示为 1,即使调用后数组为空,用逗号 (,) 分割 [重复]

    这个问题在这里已经有答案了 这是我的代码 serialNumbers String serialArray serialNumbers split int arrayLength serialArray length 即使serialArr
  • 我可以观看另一个班级的 NSNotification 吗?

    我正在尝试了解 NSNotificationCenter 如果我的应用程序代理中有这样的内容 NSNotificationCenter defaultCenter addObserver self selector selector som
  • shell 中的浮点比较

    您能否向我建议在 Bash 脚本中进行浮点比较的语法 我理想地希望将其用作if陈述 这是一个小代码片段 key1 12 3 result 12 2 if result lt key1 then some code here fi bc是你的
  • 检测字符串中的 CJK 字符 (C#)

    我正在使用 iTextSharp 生成一系列 PDF 使用 Open Sans 作为默认字体 有时 姓名会插入 PDF 的内容中 然而我的问题是 我需要插入的一些名称包含 CJK 字符 存储在 SQL Server 中的 nvarchar
  • 如何增加 MongoDB 中的现有值

    我在用MongoDB 的 Stitch 平台 我想存储一个value and a count与数据库中的该值相关联 现在value可能不是第一次出现 所以我想插入value with count 1 我可以用update 使用以下命令更新
  • 实体框架无法识别唯一键

    我有两张桌子 Reports and Visualizations Reports有一个字段 VisualizationID 这指向Visualization通过外键的同名字段 它还具有在现场声明的唯一密钥 VisualizationID不
  • 有没有办法忽略 UNIX 排序中的标题行?

    我有一个固定宽度字段文件 我正在尝试使用 UNIX 在我的例子中是 Cygwin 排序实用程序对其进行排序 问题是文件顶部有一个两行标题 该标题被排序到文件底部 因为每个标题行都以冒号开头 有没有办法告诉 sort 将前两行传递给未排序的
  • 如何在 AJAX 请求中实现 jQuery 旋转图像

    我有一个 jQuery AJAX 请求 我想在请求加载时显示 ajax spinner gif 然后在请求成功后消失 任何人都可以建议将其实现到下面的 jquery 代码中的最佳方法 function updateCart qty rowi
  • 使用 MySQL 查找最近的重复 ID

    我用来做 SELECT email COUNT email AS occurences FROM wineries GROUP BY email HAVING COUNT email gt 1 根据他们的电子邮件查找重复项 但现在我需要他们
  • Excel - 将 JavaScript/Unix 时间戳转换为日期

    我想知道如何在 Excel 中将时间戳转换为日期 JavaScript 时间戳 1486812409161 Unix时间戳 1486812409 Excel 函数 公式可以转换为以下内容 2 11 2017 11 26 AM 或任何人类可读
  • java中双精度乘法的精度?

    java中双精度值的乘法运算符的保证精度是多少 例如 2 2 100 是 220 00000000000003 但 220 是双精度数 220 00000000000003 是 220 之后的下一个双精度值 乘法工作正常 但是2 2不能精确
  • SwipeRefreshLayout setRefreshing() 最初不显示指示器

    我有一个非常简单的布局 但是当我打电话时setRefreshing true in onActivityCreated 我的片段 它最初没有显示 它仅在我进行拉动刷新时显示 有什么想法为什么它最初没有出现吗 片段 xml
  • Weak_ptr 如何知道共享资源已过期?

    考虑以下代码 include