- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我一直在想,虽然我明白了the goals of std::observer_ptr我认为如果至少有一个类似指针类型的选项知道它指向的内容是否已被删除,那就太好了。例如,我们可以有类似下面的内容
slightly_smart_ptr<Foo> p1(new Foo());
auto p2 = p1;
p1.erase(); // This deletes the foo referred to by p1.
if (p2.expired())
std::cout << "p2 is expired\n"; // this will fire
使用当前标准库实现此目的的一种方法是 make a shared_ptr to A in some scope that will exist for the lifetime of A, always refer to A by passing weak_ptrs around ,并在不再需要时通过重置 shared_ptr 删除 A。这里的 weak_ptr 将具有 observer_ptr 的基本语义,知道 A 是否已被删除。但这种方法存在问题:weak_ptr 必须被锁定,将它们变成 shared_ptr 以供使用,感觉不整洁,但更严重的是 A 的 shared_ptr 必须存在于某处,当用户想要的只是一个不拥有的稍微智能的指针时任何内容。用户同意在适当的时候手动销毁内容:没有共享所有权,因此用户在这种情况下创建 shared_ptr 是一种代码味道。
然而,我想不出可以有效隐藏此实现细节的方法。
这样的指针是否存在于提案中或存在于 boost 库或其他地方?
最佳答案
这种智能指针的问题在于它比std::unique_ptr
、T*
或std::weak_ptr
更容易出错>.
当您想知道指针是否已被其唯一所有者从别处删除时,实际上您需要共享所有权和 std::weak_ptr
。
你看,在使用弱指针之前需要“锁定”它是有原因的。这是因为当你开始使用它时,你就获得了指针的所有权。如果你不能锁定你的“知道是否被删除的观察者指针”,你就不能安全地使用它,因为在验证它的有效性之后,它随时可以被删除。
还有,你还有更深层次的矛盾。
当你有一个唯一的指针时,你就知道谁要删除它,你就知道谁是所有者。
如果您有一个程序在运行时检查指针的有效性,那是因为您的程序不知道资源所有权的状态。
如果您的程序或程序的一部分无法知道资源的所有权状态并且需要检查它是否已被删除,那么您需要确保它不会在下一行使用时被删除它,因为它可以随时删除,因为您无法知道它的所有权状态。因此,您需要在使用资源时暂时拥有该资源。因此,您需要共享所有权以在执行代码时推迟所有权决定。
如果您拥有共享所有权,则不需要知道是否已删除的观察者指针。
那时您的指针不需要存在。
所以...您认为您需要那个指针,它可能很方便...您能做什么?
您需要检查您的代码。如果只有一个所有权,为什么你需要知道指针的有效性。为什么不能简单地问问店主?
如果所有者不存在,当所有者被删除时,您想要进行检查的代码可能无效。也许您想要进行检查的结构应该与所有者同时死亡。
如果您的唯一所有者在不可预知的时刻死亡(例如,您的唯一所有者由共享所有者持有),那么您的结构可能应该检查共享所有者的有效性。
也许您调用函数的代码想要检查其指针是否仍然有效时,当所有者已死时,根本不应该调用它。
...
等等。
有很多方法可以解决这个问题,但需要一个指向唯一所有者的弱指针通常表明程序存在缺陷或程序中对象生命周期的推理存在问题。
关于c++ - 是否可以在标准弱指针之上实现非拥有 "slightly smart"指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57528382/
我正在尝试向自定义操作添加一个按钮,但未在操作中添加一个新列,使该按钮与其他按钮重叠。 代码: settings = { actions: { custom: [
背景 一段时间以来,作为用户,我注意到在某些应用程序上我可以对部分文本执行常见操作,例如: 这称为“智能文本选择”(视频 here ),它从 Android O 开始就有了,如图 here . 问题
我有一个带有 W3EditBox 的 modalDialog,用户在其中输入一个字符串,该字符串最终被添加到主窗体上的 W3ListBox 如果存在这些条件之一,我试图阻止 modalDialog 关
经过一番研究,我得出结论,这个应用程序的 ID 为 org.volt.apps , 但通过 tizen.application.launch 启动它或 tizen.application.launch
我正在评估 SMS,并且非常享受这种体验。我需要使用 window.open() 在浏览器上打开一个新窗口/选项卡。我已经使用 asm block 完成了这项工作,但我忍不住觉得有一种我不知道的更好的
我在Third Web上部署了一份智能合同,但我没有加入其中。在资源管理器页面上,智能合同的功能在第三个网站的仪表板上看不到。我是否仍然可以使用相同的部署智能合同来构建我的DApp?或者我应该从头开始
我有一定数量的集合,每个集合都包含可变数量的唯一数字 - 在它们所属的集合中是唯一的,而在其他集合中找不到。 我想制作一个最好在 Python 中实现的算法 - 但它可以是任何其他语言 - 从这些集合
我正在寻找一种“聪明”的方法来连接带有分隔符的字符串。显然我可以自己编写所有这些代码,所以我想知道是否有一种简单的方法(LINQ 或我不知道的其他方法)来执行此操作。 假设我有一组字符串(这可以是任意
我正在从事一个非常关键的性能项目,其中每个时钟周期都在我最重要的内部循环中。我正在考虑重构代码以隐藏指令延迟,但我想知道现代 CPU 的乱序执行硬件在多大程度上已经为我做到了这一点。考虑以下(简单的、
我有gradle的spring boot项目。我想使用json-smart库来处理存储在MySQL String记录中的小型json数据。 这是我对build.gradle的依赖: dependenc
我想在飞利浦电视(NETTV 型号)浏览器中提供我自己的页面预览图像。显示在历史页面地址附近。 我该怎么做? (图片来自avforum,通过google搜索获得) 飞利浦电视使用 Opera 11
“计数”列接收的数据是一个 int (0, 1, 2, ...)。对于 0 的单元格不应显示任何内容,当数据 > 0 时,应显示图像。 count.setImageURLPrefix("silk/
我是否应该构建一个自动完成的“智能”,因为每个结果都必须隐藏在一系列信息之后。 例如: 我正在寻找“博洛尼亚”,我必须运行一个查询(或多个查询,我正在寻找一种尽可能少的方法),在“名称”字段中搜索“博
知道如何做到这一点吗?我想为我的类(class)制作类似 HDTUNE PRO 的东西,但我不知道如何在 java 中读取 HDD Smart,这可能吗?它专为 Windows 设计 最佳答案 您将需
我想进行“智能”正则表达式替换。例如,考虑: import re str = "x(x) and y(y)" res = re.sub("\(.*?\)","z", str) 结果是: xz and
所以我有一个 UI 元素(单行文本),我希望它相对于整个设备水平居中——除非/直到它与给定 View 组/布局中的其他 UI 元素发生冲突。那时我希望它要么在剩余空间中居中,要么在不发生碰撞的情况下尽
我希望我能很好地解释我的问题,以便有人提供帮助。 基本上,我有一个水平滚动条(范围为 0 到 1000)和一个表示滚动条位置除以 1000 的编辑控件,以便用户可以使用滚动条选择 0 到 1 之间的数
我正在尝试制作一个自动缩进的文本区域,到目前为止它可以使用以下代码。我遇到的问题是,我目前正在阻止默认操作,即按 enter 键计算行中的制表符,然后再插入换行符。 这行得通,但我想要文本区域的默认操
我正在为我的基于 php 的网站创建一个搜索引擎。我需要搜索一个 mysql 表。 问题是,搜索引擎必须非常“智能”,这样用户才能轻松找到他们的元素(这是一个分类网站)。 我目前已经使用这段代码设置了
如何智能解析页面搜索结果返回的数据? 例如,假设我想创建一个网络服务,通过解析许多图书提供商网站的搜索结果来搜索在线图书。我可以获得页面的原始 HTML 数据,并执行一些正则表达式以使数据适用于我的
我是一名优秀的程序员,十分优秀!