std::shared_ptr 和 std::weak_ptr的用法以及引用计数的循环引用问题

2023-11-04

    在std::shared_ptr被引入之前,C++标准库中实现的用于管理资源的智能指针只有std::auto_ptr一个而已。std::auto_ptr的作用非常有限,因为它存在被管理资源的所有权转移问题。这导致多个std::auto_ptr类型的局部变量不能共享同一个资源,这个问题是非常严重的哦。因为,我个人觉得,智能指针内存管理要解决的根本问题是:一个堆对象(或则资源,比如文件句柄)在被多个对象引用的情况下,何时释放资源的问题。何时释放很简单,就是在最后一个引用它的对象被释放的时候释放它。关键的问题在于无法确定哪个引用它的对象是被最后释放的。std::shared_ptr确定最后一个引用它的对象何时被释放的基本想法是:对被管理的资源进行引用计数,当一个shared_ptr对象要共享这个资源的时候,该资源的引用计数加1,当这个对象生命期结束的时候,再把该引用技术减少1。这样当最后一个引用它的对象被释放的时候,资源的引用计数减少到0,此时释放该资源。下边是一个shared_ptr的用法例子:

#include <iostream>
#include <memory>

class Woman;
class Man{
private:
	std::weak_ptr<Woman> _wife;
	//std::shared_ptr<Woman> _wife;
public:
	void setWife(std::shared_ptr<Woman> woman){
		_wife = woman;
	}

	void doSomthing(){
		if(_wife.lock()){
		}
	}

	~Man(){
		std::cout << "kill man\n";
	}
};

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

std::shared_ptr 和 std::weak_ptr的用法以及引用计数的循环引用问题 的相关文章

  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template

随机推荐

  • 毕业设计-基于深度学习的遥感影像语义分割方法

    目录 前言 课题背景和意义 实现技术思路 一 基础理论与相关技术 二 多特征注意力融合的遥感影像语义分割网络 三 双分支轻量级的遥感影像语义分割网络 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面
  • 人工智能CV应用现状与发展 - 讲座记录

    简单介绍 CV应用现状与发展前景如何 算法工程师如何自我修炼 CV应用现状与发展前景如何 模型训练好后 新增场景case 则需要再次进行模型训练 模型固化 硬件部署 也固化 不同模型部署在不同硬件有挑战 比如 云雾和烟火雾的区别 毛肚的异常
  • VMware虚拟机安装Windows 7

    昨天我总结了win10和win11的教程 今天也把win7总结下 一来方便各位探索Windows7 二来也可以给自己备份 1 准备工作 首先我们在VMware里面安装Windows7需要做的准备工作 VMware Workstation软件
  • ISCC 2019 杂项 他们能在一起吗?(小明在网上向暗恋已久的女生表白了,对方只给小明发来了一个二维码作为回复,面对小明的求助,你会告诉他这名女生想表达的意思吗?)

    先打开下载吧 哈啊哈哈哈 点附件下载直接是这个二维码 让我们用手机扫描一下 得到一串字符串 如下 UEFTUyU3QjBLX0lfTDBWM19ZMHUlMjElN0Q 之后根据 我之前文章里的 格式 这个应该是个 base64加密过的 b
  • Linux网络编程之本地套接字

    Linux网络编程之本地套接字 一 本地套接字 二 对比本地套和网络套 三 本地套接字代码实现 一 本地套接字 二 对比本地套和网络套 三 本地套接字代码实现 接口C文件 include
  • 公钥和私钥

    概念 公钥 Public Key 与私钥 Private Key 是通过一种算法得到的一个密钥对 即一个公钥和一个私钥 公钥是密钥对中公开的部分 私钥则是非公开的部分 公钥通常用于加密会话密钥 验证数字签名 或加密可以用相应的私钥解密的数据
  • 利用Nginx配置文件转发

    编辑nginx conf内容 cd usr local nginx conf vi nginx conf 内容如下所示 error log logs error log error pid logs nginx pid user root
  • Docker-wordpress

    root 2c4g3m cd usr local src root 2c4g3m src curl fsSL https get docker com bash s docker mirror Aliyun root 2c4g3m src
  • linux实验文件管理,操作系统实验七Linux下的文件管理.pdf

    操作系统实验七Linux下的文件管理 操作系统实验七 Linux下的文件管理 一 实验目的 1 熟悉Linux 下常用的操作指令 2 加深对文件 目录 文件系统等概念的理解 3 掌握Linux 文件系统的目录结构 4 掌握有关Linux 文
  • PyTorch 提取中间层特征?

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 来源 机器学习算法与自然语言处理 编辑 忆臻 https www zhihu com question 68384370 本文仅作为学术分享 如果侵权 会删文处理 PyT
  • TCP/IP详解学习笔记

    TCP IP详解学习笔记 http blog csdn net goodboy1881 category 204448 aspx PageNumber 2 TCP IP详解学习笔记 3 IP协议 ARP协议 RARP协议 摘要 TCP IP
  • C#在linux上运行实现

    1 C 开发完了服务 2 部署到linux centos7上 3无法直接运行 解决方法 1 linux cenos7上安装mono 2 执行mono xxx exe 即可 解决方法2 下载 anyexec 1 2 linux x64 tar
  • C语言 leetcode刷题篇 删除有序数组中的重复项

    给你一个 升序排列 的数组 nums 请你 原地 删除重复出现的元素 使每个元素 只出现一次 返回删除后数组的新长度 元素的 相对顺序 应该保持 一致 由于在某些语言中不能改变数组的长度 所以必须将结果放在数组nums的第一部分 更规范地说
  • 跨域 访问总结

    文章转载自https segmentfault com a 1190000011145364 什么是跨域 跨域是指一个域下的文档或脚本试图去请求另一个域下的资源 这里跨域是广义的 广义的跨域 1 资源跳转 A链接 重定向 表单提交 2 资源
  • Mybatis从头到尾(一)--MyBatis简介及项目搭建

    一 简介 MyBatis的前身是iBATIS 是ClintonBegin在2001年发起的一个开源项目 最初侧重于密码软件的开发 后来发展成为一款基于Java的持久层框架 2004年 Clinton将iBATIS的名字和源码捐赠给了Apac
  • labelme 5.0.1版本指南(二)labelme快捷键详解与修改

    如何自定义labelme的快捷键 非常简单也很实用 吐槽一下Ctrl J创建 Ctrl N编辑 对我的键盘很不友好 路径文件名是这个是这个 home mac labelmerc 打开以后可以看到各种快捷键 shortcuts close C
  • 深度学习06-pytorch从入门到精通

    文章目录 概述 环境准备 安装cuda和cudnn 安装pytorch 基础 张量 定义 numpy转换 数学函数 随机数 计算函数 矩阵处理函数 自动梯度 案例 计算图 torchvision模块 Transforms DataSet D
  • 鲜为人知的编程真相(转载)

    当程序员的经历让我知道了一些关于软件编程的事情 下面的这些事情可能会让朋友们对软件开发感到惊讶 一个程序员用在写程序上的时间大概占他的工作时间的10 20 大部分的程序员每天大约能写出10 12行的能进入最终的产品的代码 不管他的技术水平有
  • 数据量超过亿级别,MySQL大表迁移该如何做?

    MySQL 作为当前应用最广泛的开源关系型数据库之一 具有高性能 稳定性和易用性等特性 是许多网站 应用和商业产品的主要数据存储 在一些场景中 如果出现单表行数上亿的情况 就可能需要开发和 DBA 对大表进行优化 分表 归档或扩容操作 而在
  • std::shared_ptr 和 std::weak_ptr的用法以及引用计数的循环引用问题

    在std shared ptr被引入之前 C 标准库中实现的用于管理资源的智能指针只有std auto ptr一个而已 std auto ptr的作用非常有限 因为它存在被管理资源的所有权转移问题 这导致多个std auto ptr类型的局