C++资源管理的shared_ptr与unique_ptr

2023-12-09

我一直在考虑使用unique_ptr vs shared_ptr vs own_solution。我对后者不以为然,因为我几乎肯定会弄错,但我对两者都有问题unique_ptr and shared_ptr因为两者都没有准确地捕捉到我想要的东西。我想创建一个明确拥有资源的资源管理器,但是我希望资源管理器也分发对该资源的引用。

如果我使用unique_ptr在资源管理器中并分发原始指针,它们有可能逃逸到其他地方(尽管这违反了我认为的类“合同”)。如果我使用shared_ptr并分发weak_ptr,没有什么可以阻止调用者转换weak_ptr to a shared_ptr并存储它,从而可能创建一个循环,或更糟糕的是,资源的生命周期超出了资源管理器的生命周期。所以我想我正在寻找的是一个可尊敬的weak_ptr无法转换为shared_ptr.

或者我只是想通过代码中一些措辞强硬的注释来执行合同?

感谢您对此可能有的任何想法。


最后,你不能强迫任何人听。询问微软、苹果或任何开源库开发人员,他们都知道这首歌。在正确的词语和位置发表评论是您最好的选择。

避免创建自己的智能指针类,它会阻碍组合并降低可读性。作为最后的手段,尝试查看 boost 或您的代码已经可以使用的任何框架。

如果您有非所有者,他们可以选择持有weak_ptrs 或(如果保证在持续时间内保持有效)原始指针。
如果你使用shared_ptr内部(为什么要),最好提供weak_ptr和原始指针。

所有这些智能指针都明确表示所有权策略。原始指针表示无或不拥有。

  • auto_ptr:不要使用,即使对于谨慎的人来说,也有太多陷阱,因此已被弃用。
  • unique_ptr: 独家所有权。
  • shared_ptr: 共享所有权
  • weak_ptr:没有所有权,可能会被背后删除。
  • raw pointer
    • 明确无所有权,保证更长的使用寿命
    • 或手动所有权管理。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++资源管理的shared_ptr与unique_ptr 的相关文章

  • 部署 MVC4 项目时出错:找不到文件或程序集

    过去 我只需使用 Visual Studio 2012 发布到 AWS 菜单项即可部署我的 MVC4 网站 到 AWS Elastic Beanstalk 现在 程序可以在本地编译并运行 但无法部署 从消息来看 它似乎正在寻找不在当前部署的
  • 创建 DirectoryEntry 实例以供测试使用

    我正在尝试创建 DirectoryEntry 的实例 以便可以使用它来测试将传递 DirectoryEntry 的一些代码 然而 尽管进行了很多尝试 我还是找不到实例化 DE 并初始化它的 PropertyCollection 的方法 我有
  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • C++ 求二维数组每一行的最大值

    我已经设法用这个找到我的二维数组的每一行的最小值 void findLowest int A Cm int n int m int min A 0 0 for int i 0 i lt n i for int j 0 j lt m j if
  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • c 中的错误:声明隐藏了全局范围内的变量

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

    我需要构建一个方法 它将接收模型 从中构建excel 构建和接收部分完成没有问题 然后使用内存流导出 让用户下载它 不将其保存在服务器上 我是 ASP NET 和 MVC 的新手 所以我找到了指南并将其构建为教程项目 public File
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • A* 之间的差异 pA = 新 A;和 A* pA = 新 A();

    在 C 中 以下两个动态对象创建之间的确切区别是什么 A pA new A A pA new A 我做了一些测试 但似乎在这两种情况下 都调用了默认构造函数 并且仅调用了它 我正在寻找性能方面的任何差异 Thanks If A是 POD 类
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr
  • 更改显示的 DPI 缩放大小使 Qt 应用程序的字体大小渲染得更大

    我使用 Qt 创建了一些 GUI 应用程序 我的 GUI 应用程序包含按钮和单选按钮等控件 当我运行应用程序时 按钮内的按钮和字体看起来正常 当我将显示器的 DPI 缩放大小从 100 更改为 150 或 200 时 无论分辨率如何 控件的

随机推荐

  • JAX-RS 2 过滤器的范围有哪些?

    我使用的是 RestEasy 3 0 2 它是第一个 JAX RS 2 实现之一 并在 Tomcat 7 中运行我的应用程序 我还通过 WELD 在我的应用程序中使用注入 WELD 通过其 CDI 适配器与 RestEasy 集成 到目前为
  • cout 或 printf 两者中哪一个具有更快的 C++ 执行速度?

    我已经用 C 编写代码很长时间了 我一直想知道哪个执行速度更快printf or cout 情况 我正在用 C 设计一个应用程序 并且有一定的限制 例如执行时间限制 我的应用程序已在控制台上加载打印命令 那么哪一个更可取printf or
  • 在 Python 中以非常高的质量保存图像

    如何以极高的质量保存 Python 绘图 也就是说 当我不断放大PDF文件中保存的对象时 为什么没有任何模糊现象 另外 保存它的最佳模式是什么 png eps 或者其他的 我做不到pdf 因为有一个隐藏的数字发生了混乱Latexmk汇编 如
  • Python:加权变异系数

    我怎样才能计算加权变异系数 CV 在 Python 中的 NumPy 数组上 为此 可以使用任何流行的第三方 Python 包 我可以使用以下方法计算简历scipy stats variation 但它没有加权 import numpy a
  • 将标题添加到多个文本文件中[重复]

    这个问题在这里已经有答案了 可能的重复 Sed Awk 在文件中搜索和替换 插入文本 我想知道如何将一个 标题 行添加到一个目录中包含的多个文本文件中 Bash 命令行会很棒 Thx EDIT 我在这里找到了我的需求 http perldo
  • 四舍五入到小数点后两位[重复]

    这个问题在这里已经有答案了 可能的重复 将双精度数舍入为小数点后 2 位有效数字 I have mkm amountdrug fluidvol 1000 60 infrate ptwt 在我的Java代码中 该代码工作正常 但返回几个小数位
  • 使用 bash 将字符串转换为数组,并尊重分组的引号[重复]

    这个问题在这里已经有答案了 我有一个字符串 Str This string has a substring 该字符串有逗号 所以如果我打印我看到的字符串 echo Str This string has a substring 如果我输入命
  • 按组选择最大行值

    我一直在尝试通过查看其他帖子来处理我的数据 但我不断收到错误 我的数据new看起来像这样 id year name gdp 1 1980 Jamie 45 1 1981 Jamie 60 1 1982 Jamie 70 2 1990 Kat
  • javascript window.open 在 safari 和 chrome 中不起作用

    我有一个 div 元素 div 是一个图标 当您单击此图标时 会触发表单提交 在提交的表单上有一些计算 并且根据这些计算的结果打开一个新选项卡 我用 window open url blank 但在 safari 和 chrome 中 这个
  • 具有破坏输入 ngmodel 范围的指令

    我应该给指令赋予什么范围 以便输入显示初始值 Toto 我不想采用范围 true HTML 代码
  • sql选择前10条记录

    我有下表 点 recno uid uname points 1 a abc 10 2 b bac 8 3 c cvb 12 4 d aty 13 5 f cyu 9 我需要的是仅显示前十条记录 按点 desc 和每页上的五条记录 我有以下
  • BigQuery 中是否有像“hive metastore”这样的元数据存储?

    我是 BigQuery 的新手 我只是想知道 BigQuery 中是否有类似 hive 元存储 有关所有表 列及其描述的元数据 的东西 BigQuery 提供了一些特殊表 其内容表示元数据 例如数据集中的表和视图的列表 元表 是只读的 要访
  • 如何在p5.js中识别圆弧内的光标? [关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我正在制作一个饼图 希望当光标移动到我的分段上时突出显示 然后在用户单击分段时展开 我看过很多关于如何让圆形或方形识别光标在其空间内的教程 但我无法理解任何可以根据输入值改变大小的弧线
  • 如何用Java写入ssh的stdin?

    在命令行上一切工作正常 但是当我将我想要的内容翻译成 Java 时 接收进程永远不会在标准输入上获取任何内容 这是我所拥有的 private void deployWarFile File warFile String instanceId
  • AppleScript:如何获取最顶层终端的当前目录

    我想获取最顶层终端选项卡 窗口的当前目录 通过 AppleScript 或其他方式 这并不重要 我怎样才能做到这一点 另一个解决方案 get foregroundterminal curdir fast scpt tell applicat
  • AWS lambda NodeJS运行时:io:在封闭管道上读/写

    我正在尝试执行来自一个的几个异步请求lambda功能 第一次通话resolveEndpoints 成功 第二个失败 2017 11 03 17 13 27 Function oauth callbackHandler timed out a
  • Unity为非泛型接口注册泛型类型

    我的场景 对我来说 看起来非常简单 但我找不到解决方案 我有这样的场景 public class Class
  • 强制 Matlab 输出到命令行

    我正在从 Windows 命令提示符运行 MATLAB 脚本 C Program Files MATLAB R2014B bin matlab nodisplay nosplash nodesktop wait r test m test
  • 在 Material UI 中,如何覆盖选择器选择的组件样式?

    在 Material UI 中 延长之间的距离MuiInputLabel and MuiInput 我必须重写 marginTop 的label MuiInput formControl 然而 createMuiTheme的 overrid
  • C++资源管理的shared_ptr与unique_ptr

    我一直在考虑使用unique ptr vs shared ptr vs own solution 我对后者不以为然 因为我几乎肯定会弄错 但我对两者都有问题unique ptr and shared ptr因为两者都没有准确地捕捉到我想要的