在包含shared_ptr的地图上使用find_if会增加引用计数

2023-12-10

我正在创建一个程序,其中有一个包含shared_ptr 的映射。当我尝试在其中找到一个元素时std::find_if,shared_ptr的引用计数增加。例子:

#include <iostream>
#include <memory>
#include <map>
#include <algorithm>


int main(void)
{
    std::map<int, std::shared_ptr<int>> map;
    map[1] = std::make_shared<int>(3);
    map[2] = std::make_shared<int>(5);
    map[4] = std::make_shared<int>(-2);

    auto it = std::find_if(map.begin(), map.end(),
        [](const std::pair<int, std::shared_ptr<int>> &elem) {
            std::cout << "find_if: " << elem.second.use_count() << std::endl;
            return *elem.second == 5;
        });

    std::cout << "main: " << it->second.use_count() << std::endl;
}

通过这段代码我得到的输出

find_if: 2
find_if: 2
main: 1

我不确定引用计数增加是否是正确的行为。

我正在使用 Visual Studio 2017。


问题是 lambda 参数的类型

const std::pair<int, std::shared_ptr<int>> &

...这不对应于std::map<<int, std::shared_ptr<int>>>::value_type(你错过了const对于密钥类型)。

因此,为了调用 lambda,类型的临时对象std::pair<int, std::shared_ptr<int>>必须从构建std::pair<const int, std::shared_ptr<int>>存储在std::map.

当这个对象被构造时,shared_ptr被复制,因此它的引用计数器必须递增。

如果将参数类型更改为

const std::pair<const int, std::shared_ptr<int>> &

……问题就消失了。你也可以使用const auto&而不是这里的完整类型。

1 If you use a non-const reference here, you'll get a compiler error because you cannot initialize a reference of type std::pair<int, std::shared_ptr<int>> from a std::pair<const int, std::shared_ptr<int>>, but a const-reference allow a temporary to be used instead.

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

在包含shared_ptr的地图上使用find_if会增加引用计数 的相关文章

  • 如何重写实体数据模型创建的对象上的 Equals?

    我创建了一个实体数据模型 它从 SQLite 数据库中提取记录 其中一个表是 People 我想重写 person Equals 方法 但我不确定去哪里进行这样的更改 因为 Person 对象是自动生成的 我什至看不到该 autogen 代
  • 如何使用 LINQ ForEach 更改 List

    我有一个List
  • 以编程方式更改 Excel 中的字体(Trebuchet MS、Calibari)C#

    我目前正在使用一个 C 应用程序 该应用程序有一个将生成 Excel 文件的类 一切都很顺利 Excel 工作表上填充的数据具有 Times New Roman 字体 我想将其更改为其他字体 Calibari 我怎样才能以编程方式做到这一点
  • 在 C/C++ 中绘制填充椭圆的简单算法

    在SO上 找到了以下绘制实心圆的简单算法 for int y radius y lt radius y for int x radius x lt radius x if x x y y lt radius radius setpixel
  • ObjectTrackingEnabled 和 linq-to-sql

    I read here http www sidarok com web blog content 2008 05 02 10 tips to improve your linq to sql application performance
  • MVVM 同步集合

    是否有一种标准化方法可以将 Model 对象集合与 C 和 WPF 中匹配的 ModelView 对象集合同步 我正在寻找某种类 可以使以下两个集合保持同步 假设我只有几个苹果 并且可以将它们全部保存在内存中 换句话说 我想确保如果我将 A
  • 命令中带空格的 Windows C 系统调用

    我无法使用名称和参数中的空格进行系统调用 例如 system c program files something example exe c my files example txt 我尝试过各种我知道的方法来逃避 但没有任何效果 我努力了
  • 用于 C/C++ 的独立跨平台 (Windows/Linux) 文件压缩?

    我正在寻找一个 最好是小的 C 或 C 开源库 我可以将其包含在我的 MIT 许可项目中 托管在 google 代码上 我是一名业余爱好 C C 程序员 所以我并不那么先进 但我只知道为名为 SA MP 的应用程序 适用于 Windows
  • 测试从 ComboBox 派生的自定义控件

    我创建了一个从 ComboBox 派生的控件 并希望对其行为进行单元测试 但是 它在我的单元测试中的行为似乎与实际应用程序中的行为不同 在实际应用程序中 Combobox DataSource 属性和 Items 同步 换句话说 当我更改
  • 第三方引用的 dll 未被复制来构建

    我有一个第三方 net dll 被我的 dll 类库项目 A 引用和使用 我的控制台应用程序项目 B 引用项目 A 我的问题是第三方 dll 没有被复制到控制台应用程序项目 B 的构建中 这里有什么问题呢 我的 dll 类库中引用的第三方
  • UWP - 绑定枚举差异

    我遇到了一个非常有趣的问题 假设 UWP 应用中有以下 XAML 页面内容
  • 如何让 PCRE 与 C++ 一起使用?

    这是一个新手问题 但我希望我能尽可能清楚地表达我的问题 我正在尝试用 C 进行模式匹配 我已经从以下位置下载了 PCRE 的 Win32 版本here http gnuwin32 sourceforge net packages pcre
  • 如何在 C++ 中初始化嵌套类的构造函数

    我在初始化嵌套类构造函数时遇到问题 这是我的代码 include
  • 实体框架中的导航属性是什么

    我是实体框架的新手 当Visual Studio创建模型图时我们主要可以看到Entities Propertie和Navigation Properties这两个东西 那么这些Navigation Properties是什么 如何使用它们
  • 为什么 ASP.Net MVC Range 属性采用类型?

    我只是想知道为什么范围验证属性可以采用类型和两个字符串作为参数 这是为了根据枚举或类似的东西验证字符串吗 另外 我想做的是找到一种简单的方法来验证必须出现在枚举中的 3 个字符的字符串 有什么建议吗 谢谢 亚历克斯 我确实发现你提到的 Ra
  • 矩阵行列式算法 C++

    我是编程新手 我一直在寻找一种找到矩阵行列式的方法 我在网上找到了这段代码 但我很难理解这里的算法 我对递归的基础没有问题 但继续和主循环我很难理解 非常感谢任何可以向我解释该算法的人 int determ int a MAX MAX in
  • Task.Delay 到底是如何工作的?

    他们说 Task Delay 是一个异步 Thread Sleep 为了测试这一点 我写了下面的代码 我希望立即打印 One 然后 3 秒后将打印结果变量 15 2 秒后 将打印 Two 但似乎并非如此 一 不会立即打印 3 秒后打印 On
  • 预览MouseMove 与 MouseMove

    我有相当多的 XAML 经验 但最近我注意到我的大多数同事都使用预览鼠标移动代替鼠标移动事件 我一直用鼠标移动它对我很有帮助 但我忍不住问我什么时候应该使用预览鼠标移动什么时候鼠标移动 有什么区别 各自有什么优点和缺点等等 PreviewM
  • 从不同的线程访问对象

    我有一个服务器类 它基本上等待来自客户端的连接 在该类中 我创建了一个 NetworkStream 对象 以便能够从客户端接收字节 由于 NetworkStream Read 方法不是异步的 这意味着它将等到从客户端读取字节才能继续执行类似
  • 有关 Endian 性和 .Net 的详细信息?

    我有几个关于字节顺序的问题 这些问题足够相关 我保证将它们作为一个问题提出 1 字节顺序是由 Net还是由硬件决定的 2 如果是由硬件决定的 我怎样才能在C 中找出硬件的字节序 3 字节序是否影响二进制交互 例如 OR AND OR 或移位

随机推荐

  • 在 Ruby 安装期间遇到 RVM 问题 (1.9.2)

    我正在尝试通过 RVM 安装 ruby 但收到以下错误 并且日志不太清楚发生了什么 有人遇到过这种情况吗 我似乎记得 Ruby 不应该以 root 身份安装 但我对收到的权限错误有点怀疑 Installing Ruby from sourc
  • 如何使用 PHP 中的curl 上传文件

    如何在 PHP 中使用 cURL 或其他方式上传文件 换句话说 用户在表单上看到文件上传按钮 表单被发布到我的 PHO 脚本 然后我的 PHP 脚本需要将其重新发布到另一个脚本 例如在另一台服务器上 我有这个代码来接收文件并上传它 echo
  • 10 秒内完成 Postgresql 查询

    有没有办法创建一个将运行十秒的查询 我不需要真实的数据 只是一种长时间运行查询的方法 这样我就可以测试系统在这段时间内的工作情况 我不想创建一个巨大的表并为此进行简单的选择 有什么技巧吗 pg sleep SELECT pg sleep 1
  • 使用 C++ 和 NativeActivity 类获取 Android APK 的名称

    我正在使用 NDK 和 NativeActivity 编写 Android 应用程序 我的应用程序依赖于一些作为资产提供的第三方代码 目前 我正在尝试提取这些资产 同时保持文件夹结构完整 我尝试过使用 AssetManager 但为了保持文
  • 找到点的质心[关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我有N分 每个点都有 X 和 Y 坐标 我需要找到该点的质心 X 和 Y 你能给我一个算
  • 停止 TextChanged 上的回发

    我在 aspx 页面中有一个文本框 其中附加了一个 TextChanged 事件 我还在文本框中附加了一个验证器 当文本更改时 将触发验证 但如果出现错误 仍会调用 textchanged 事件 您知道如果验证器触发是否可以停止 textc
  • JQuery .load() 使内容在加载后不可点击

    我有一个页面 其中有一个 div 该 div 中的内容由包含页面填充 并且该包含页面正在调用数据库来检索内容 当用户单击 添加任务 按钮时 将进行 ajax 调用以将内容插入数据库 并使用 load 刷新显示所有任务的 div 删除任务 也
  • 如何使用 JavaScript 合并 JSON 对象?

    如何使用普通 不带 jQuery JavaScript 合并 JSON 对象 要求是 转换自 chartData date 2014 05 1 CAT1 0 1 date 2014 05 1 CAT2 0 2 date 2014 05 1
  • 在 Spring 服务类中使用 ConcurentHashMap 和 AtomicInteger 作为实例变量

    我正在尝试在注入控制器的单例 Spring 服务中实现 ConcurentHashMap 的线程安全使用 Service public MyService final ConcurrentMap
  • 标签添加到文本区域中的选定文本

    如何创建一些 javascript 来执行以下操作 当用户单击 BOLD 按钮时 所选文本将被一个 和一个 包围
  • 参数包必须位于参数列表的末尾...何时以及为什么?

    我不明白为什么如果参数列表绑定到一个类 参数包必须位于参数列表的末尾 而如果参数列表是成员方法声明的一部分 则放松约束 换句话说 这个编译 class C template
  • 如何设置 Laravel 的关联位置?

    我使用以下结构来连接表 with attachments offers publisher public function publisher return this gt belongsTo App User user id id 如何加
  • docker容器中的JHipster应用程序无法在主机网络上访问,无法与非主机网络上的其他容器通信

    我正在尝试在 OS X 开发计算机上的 docker 容器中部署 JHipster 微服务和注册表 我或多或少使用 JHipster 提供的默认 docker compose 配置来部署注册表 version 2 services jhip
  • 详细500错误信息,ASP+IIS 7.5

    IIS 7 5 2008rc2 经典 asp 500 错误消息 由于发生内部服务器错误 该页面无法显示 我需要知道如何配置 IIS 以获得更详细的错误 我尝试将 ASP 配置中的所有调试选项设置为 true 但这没有用 谁能帮我 我遇到了同
  • 更改第 2 列中的日期,其中数字与第 3 列不匹配

    我以前尝试过这个 但需要改变方向 我正在更改数字 但发现数字不同后我需要更改日期 我的文本有 3 列 第二列和第三列相似 但偶尔会有 1 4 位数字不匹配 我添加了一个示例 以便您可以看到我在说什么 我已经添加了 substr 命令 但那是
  • .htaccess 删除网址中的问号

    我有一个网站 其网址中有一个我想要重写的查询字符串 网址是domain com profile php user sven我希望它重定向到domain com profile user sven 我创建了一个 htaccess 文件 其规则
  • 除了 Simple Solver 之外,还有什么软件可以求解给定输入/输出的数字电路?

    All 我在这里找到了一个名为 简单求解器 的东西 http home roadrunner com ssolver syn html 你可以在这里下载 http www softpedia com progDownload Simple
  • 一个项目,多个客户。角2

    好吧 我有一个问题 但我似乎找不到答案 假设我有一个项目 x 它将由多个客户端使用 每个客户端都有自己的功能 可以共享或不共享 以及自己的自定义样式表和 html 布局 因此 按照正常的角度 2 单击模式 我想知道这是否可能 Example
  • 在 R v3.5.1 中,是什么导致打印列表的第一个元素用反引号括起来?

    最近我使用 RStudio v1 1 453 在 Windows 10 上将 R 更新到 3 5 1 我感兴趣的是为什么打印列表的第一个元素现在总是用反引号括起来 即使它是没有非法符号的标准名称 例如 a 如本例所示 R 3 5 1 lis
  • 在包含shared_ptr的地图上使用find_if会增加引用计数

    我正在创建一个程序 其中有一个包含shared ptr 的映射 当我尝试在其中找到一个元素时std find if shared ptr的引用计数增加 例子 include