对象的共享所有权是糟糕设计的标志吗?

2023-12-21

背景: 阅读时Stroustrup 博士的论文 http://www2.research.att.com/~bs和常见问题解答,我注意到一些来自传奇 CS 科学家和程序员的强烈“意见”和很好的建议。其中之一是关于shared_ptr在 C++0x 中。他开始解释shared_ptr以及它如何表示所指向对象的共享所有权。在最后一行,他说,我引用 http://www2.research.att.com/~bs/C++0xFAQ.html#std-shared_ptr:

. A shared_ptr代表共享 所有权,但共享所有权不是 我的理想:如果有一个物体就更好了 有明确的所有者和明确的, 可预测的寿命。

我的问题:RAII 在多大程度上替代了垃圾收集等其他设计模式?我假设手动内存管理不用于表示系统中的共享所有权。


RAII 在多大程度上替代了垃圾收集等其他设计模式?我假设手动内存管理不用于表示系统中的共享所有权

嗯,有了 GC,你真的不需要think关于所有权。该物体停留在周围只要anyone需要它。共享所有权是默认的也是唯一的选择。

当然,一切can通过共享所有权来完成。但它有时会导致非常笨拙的代码,因为你can't控制或限制对象的生命周期。你必须使用C#using块,或try/finally在finally子句中使用close/dispose调用来确保对象在超出范围时被清理。

在这些情况下,RAII 更适合:当对象超出范围时,应该进行所有清理自动地.

RAII在很大程度上取代了GC。 99% 的情况下,共享所有权并不是您真正想要的want理想情况下。这是一个可以接受的妥协,作为交换,通过获得垃圾收集器来节省很多麻烦,但它并不真正符合您的要求want. You want资源会在某个时刻消亡。不是之前,也不是之后。当 RAII 成为一个选项时,在这些情况下它会导致更优雅、简洁和健壮的代码。

但 RAII 并不完美。主要是因为它不能很好地处理偶尔的情况,您只是不知道对象的生命周期。只要有人使用它,它就必须保留很长一段时间。但您不想永远保留它(或者只要范围围绕所有客户端,这可能只是主函数的全部)。

在这些情况下,C++ 用户必须“降级”到共享所有权语义,通常通过引用计数来实现shared_ptr。在这种情况下,GC 会胜出。它可以更稳健地实现共享所有权(例如,能够处理循环),并且更高效(引用计数的摊余成本为huge与像样的 GC 相比)

理想情况下,我希望以一种语言看到两者。大多数时候,我想要 RAII,但偶尔,我有一个资源,我只想把它扔到空中,而不用担心它会在何时何地降落,只相信它会在它落地时被清理掉。这样做是安全的。

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

对象的共享所有权是糟糕设计的标志吗? 的相关文章

  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template

随机推荐

  • 如何理解 gsub(/^.*\//, '') 或正则表达式

    分解下面的代码以理解我的正则表达式和gsub理解 str abc def ghi rb str str gsub str ghi rb 字符串的开头 转义字符 从开始到最后出现的所有内容 在字符串中 我对这个表达的理解正确吗 如何 到底工作
  • 使用 void 指针连接两个数组 (C)

    我想将两个相同类型的数组连接成一个具有相同类型的新数组 但问题是我必须使用void指针 不知怎的 我的代码从第三个元素开始就无法工作 我在网上搜索了一下 但似乎没有人遇到这个问题 include
  • 在相机/预览运行时显式更改 CameraX 焦点? (不仅仅是在构建相机时。)

    如果您想在构建 CameraX 相机时将焦点设置为某个值 例如 10f 这非常简单 通常情况下 previewBuilder new Preview Builder preview previewBuilder build 启动固定焦距相机
  • Python 请求——限制上传速度

    注意 这不是重复的 速率限制上传和下载完全不同 我见过的许多库可以限制下载速率 但不能限制上传速率 这应该重新打开 我正在 Python 中运行大文件上传 2 8 GB 我使用的代码大致如下 files md5 md5hash modifi
  • 将列名作为PreparedStatement的输入参数

    我已经使用过这里的搜索 以及其他论坛 但还没有找到我想要做的事情的确切答案 我知道它可以很容易地以其他方式完成 这只是我正在为大学课程编码的一个小沙箱框架 在真实的环境中我只需要 Spring Hibernate 等 因此 我所做的就是使用
  • MySQL 5 中的多列主键

    我正在努力学习如何使用钥匙并改掉必须拥有钥匙的习惯SERIAL输入我所有表中所有行的 ID 同时 我还在处理多对多关系 因此在协调关系的表的任一列上要求唯一值会阻碍这一点 如何在表上定义主键 以便任何给定值都可以在任何列中重复 只要所有列中
  • 将 Xcode 更新到版本 10.3 (10G8) 后故事板损坏并且应用程序不再运行

    我刚刚将 Xcode 更新到版本 10 3 10G8 Now my project is not run with this error com apple actool errors error Failed to find a suit
  • 默认情况下,git 是否从新存储库中排除 eclipse 项目文件?

    我尝试过将几个 Eclipse 项目推送到 github 存储库 每次我在克隆或将它们带回 Eclipse 时遇到麻烦 原因似乎是当我执行 git add 时 Eclipse 特定的项目文件 project classpath 等 没有暂存
  • 链接描述文件中 *(.data)、*(.data*) 和 *(.data.*) 之间的区别

    只是想知道这种结构之间有什么区别 对于text data rodata bss等 在链接描述文件中 data data data data data data 在所有情况下我们都会聚集data来自所有目标文件的部分 但问题在于细节 快速测试
  • 如何使用合并替换 Laravel 请求中的嵌套数组值?

    有一个函数可以替换请求中的输入 称为合并 我想更改嵌套数组的值 以便可以通过以下方式验证它 this gt validate method 这是的输出 request gt all array 2 type gt customer user
  • 计算当天之间的总天数 (SQL)

    我正在尝试计算当前日期和名为 DayConfirm 日期时间 的特定列之间的总天数 我想在带有 DayChanged 的行旁边的新列中显示总天数到目前为止 我得到了这个 SELECT DATEDIFF CURDATE DayConfirm
  • 如何为 TableAdapter 参数设置值

    Goal 我希望能够有两个组合框 其中一个是第二个组合框的父级或所有者 这意味着每当我在第一个中选择一个值时ComboBox 第二ComboBox将过滤其结果以显示与第一个相关的相应值ComboBox 例如 注意 此示例已以编程方式完成 我
  • 构建仅后台 COCOA 应用程序作为启动守护进程的缺点?

    构建一个没有任何 GUI 的仅后台 COCOA 应用程序并将其作为启动守护进程运行是否有任何缺点 这将使用 import
  • 保存时热重载

    我目前在 OSX 上使用终端和 vim 作为 Flutter 的开发环境 一切进展顺利 只是当我保存任何 dart 文件时应用程序不会重新加载 有没有办法触发这种行为 目前我必须转到终端并按 r 才能查看我的更改 抱歉这个插件 但我写了一个
  • Azure DevOps 构建中出现“在 .gitmodules 中找不到子模块路径的 url”错误

    存储库 网站 有一个子模块 模板 该子模块在存储库的目录中被引用 目标是使用 Azure DevOps 管道一起构建存储库和子模块 但是 Azure DevOps 构建会引发以下错误 fatal No url found for submo
  • 如何在其他处理选项卡中使用 .java 文件中的公共类?

    我的问题似乎微不足道 但经过两个小时的谷歌搜索后我什么也没得到 我有加工草图 第一个主选项卡包含 Foo bar void setup void draw 第二个是 Foo java 文件 package processing core i
  • boost zip_iterator 和 std::sort

    我有两个数组values and keys两者长度相同 我想按键排序values数组使用keys数组作为键 我被告知 boost 的 zip 迭代器正是用于locking两个数组在一起并同时对它们执行操作 这是我尝试使用 boost zip
  • 登录后无法访问 FOSUserBundle 管理区域

    我按照以下给出的说明将 FOSUserBundle 用于管理部分和前端 https github com FriendsOfSymfony FOSUserBundle issues 849 对于前端 一切正常 但对于管理部分 当我访问我的管
  • 使用 Json.NET 序列化时如何应用重新映射所有属性名称的一般规则?

    将 Json 对象反序列化为 Net 时type 如果字段名称不匹配 我发现你可以装饰你的type的属性与 JsonProperty PropertyName name 对于一些不匹配的属性来说 这很好 但是有没有办法设置约定或规则呢 Js
  • 对象的共享所有权是糟糕设计的标志吗?

    背景 阅读时Stroustrup 博士的论文 http www2 research att com bs和常见问题解答 我注意到一些来自传奇 CS 科学家和程序员的强烈 意见 和很好的建议 其中之一是关于shared ptr在 C 0x 中