什么时候使用哪种指针?

2023-12-10

好吧,上次我以写 C++ 为生时,std::auto_ptr所有的标准库都可用吗?boost::shared_ptr风靡一时。我从未真正研究过 boost 提供的其他智能指针类型。据我所知,C++11 现在提供了 boost 提出的一些类型,但不是全部。

那么有人有一个简单的算法来确定何时使用哪个智能指针吗?最好包括有关哑指针的建议(原始指针,例如T*)和其余的 boost 智能指针。 (就像是this会很好)。


共享所有权:
The shared_ptr and weak_ptr采用的标准与他们的标准几乎相同助推同行。当您需要共享资源并且不知道哪个资源将是最后一个存活时,请使用它们。使用weak_ptr观察共享资源而不影响其生命周期,不破坏循环。循环与shared_ptr通常不应该发生 - 两个资源不能互相拥有。

请注意,Boost 还提供shared_array,这可能是一个合适的替代方案shared_ptr<std::vector<T> const>.

接下来,Boost 提供intrusive_ptr,如果您的资源已经提供引用计数管理并且您希望将其采用 RAII 原则,那么这是一个轻量级解决方案。该标准未采用该标准。

独特的所有权:
升压还有一个scoped_ptr,它是不可复制的,并且您不能为其指定删除程序。std::unique_ptr is boost::scoped_ptr类固醇,应该是你的当您需要智能指针时的默认选择。它允许您在其模板参数中指定删除器,并且是movable,不像boost::scoped_ptr。只要您不使用需要可复制类型的操作(显然),它也可以在 STL 容器中完全使用。

再次注意,Boost 有一个数组版本:scoped_array,该标准通过要求统一std::unique_ptr<T[]>部分专业化将delete[]指针而不是delete荷兰国际集团(与default_deleter). std::unique_ptr<T[]>还提供operator[]代替operator* and operator->.

注意std::auto_ptr仍在标准中,但它是已弃用. §D.10 [depr.auto.ptr]

类模板auto_ptr已弃用。 [Note:类模板unique_ptr(20.7.1)提供了更好的解决方案。——尾注 ]

无所有权:
使用哑指针(原始指针)或引用非拥有参考文献资源并且当您知道资源将过时引用对象/范围。当您需要可空性或可重置性时,首选引用并使用原始指针。

如果您想要对资源进行非拥有引用,但您不知道该资源是否会比引用它的对象寿命更长,请将资源打包在shared_ptr并使用weak_ptr- 您可以测试父母是否shared_ptr还活着lock,这将返回一个shared_ptr如果资源仍然存在,则该值不为空。如果想测试资源是否已死亡,请使用expired。两者听起来很相似,但在并发执行时却有很大不同,如expired只保证该单个语句的返回值。看似无辜的测试,例如

if(!wptr.expired())
  something_assuming_the_resource_is_still_alive();

是一个潜在的竞争条件。

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

什么时候使用哪种指针? 的相关文章

  • 如何在 Visual Studio 2010 中增强 XAML 设计器?

    当我使用 XAML 设计器时 进入设计器和退出设计器是如此困难和缓慢 当我这样做时 Visual Studio 卡了一段时间 有什么方法可以增强 XAML 设计器和编辑器吗 Ant 保存 XAML 文件时非常慢 这通常意味着您可能有复杂的
  • 在 C# 中创建具有单独列的分隔文本

    我一直在尝试在 C 中创建一个制表符限制的文本文件 以便数据正确显示在单独的列中 Firstname Lastname Age John Smith 17 James Sawyer 31 我尝试过 t 字符 但我得到的只是 Firstnam
  • 如何读取扩展文件属性/文件元数据

    因此 我按照教程使用 ASP net core 将文件 上传 到本地路径 这是代码 public IActionResult About IList
  • 向 Nhibernate 发出 SQL 查询

    如何将此 SQL 查询发送给 Nhibernate SELECT Customer name FROM Company INNER JOIN Customer ON Company CompanyId Customer CompanyId
  • 启动时出现 OData v4 错误:找不到段“Whatever”的资源

    我正在构建新的 v4 服务 一切进展顺利 直到我为新模型 实体添加了新控制器 并在启动站点进行测试运行时收到此错误 控制器似乎编码正确 就像其他控制器一样 控制器 CustomersOData 中的操作 GetFeed 上的路径模板 Cus
  • 如何从 .resx 文件条目获取注释

    资源文件中的字符串有名称 值和注释 The ResXResourceReader类让我可以访问名称和值 有办法看评论吗 你应该能够得到Comment via ResXDataNode class http msdn microsoft co
  • 将 System.Windows.Input.KeyEventArgs 键转换为 char

    我需要将事件参数作为char 但是当我尝试转换 Key 枚举时 我得到的字母和符号与传入的字母和符号完全不同 如何正确地将密钥转换为字符 这是我尝试过的 ObserveKeyStroke this new ObervableKeyStrok
  • 存储来自其他程序的事件

    我想将其他应用程序的事件存储在我自己的应用程序中 事件示例 打开 最小化 Word 或打开文件时 这样的事可能吗 运行程序 http msdn microsoft com en us library ms813609 aspx and 打开
  • 如何在 Linq 中获得左外连接?

    我的数据库中有两个表 如下所示 顾客 C ID city 1 Dhaka 2 New york 3 London 个人信息 P ID C ID Field value 1 1 First Name Nasir 2 1 Last Name U
  • 在一个字节中存储 4 个不同的值

    我有一个任务要做 但我不知道从哪里开始 我不期待也绝对不想要代码中的答案 我想要一些关于该怎么做的指导 因为我感到有点失落 将变量打包和解包到一个字节中 您需要在一个字节中存储 4 个不同的值 这些值为 NAME RANGE BITS en
  • 如何将整数转换为 void 指针?

    在 C 中使用线程时 我面临警告 警告 从不同大小的整数转换为指针 代码如下 include
  • 如何在 Blackberry Cascades 中显示具有特定号码的电话板

    我正在使用带有 C QT 和 QML 的 Blackberry Cascades 10 Beta 3 SDK 以及 Blackberry 10 Dev Alpha Simulator 和 QNX Momentics IDE 并且我正在尝试实
  • HttpWebRequest 在第二次调用时超时

    为什么以下代码在第二次 及后续 运行时超时 代码挂在 using Stream objStream request GetResponse GetResponseStream 然后引发 WebException 表示请求已超时 我已经尝试过
  • 如何从main方法调用业务对象类?

    我已将代码分为业务对象 访问层 如下所示 void Main Business object public class ExpenseBO public void MakeExpense ExpensePayload payload var
  • C++ 密码屏蔽

    我正在编写一个代码来接收密码输入 下面是我的代码 程序运行良好 但问题是除了数字和字母字符之外的其他键也被读取 例如删除 插入等 我知道如何避免它吗 特q string pw char c while c 13 Loop until Ent
  • 如何在 C# 中调整图像大小同时保持高质量?

    我从这里找到了一篇关于图像处理的文章 http www switchonthecode com tutorials csharp tutorial image editing saving cropping and resizing htt
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • memset 未填充数组

    u32 iterations 5 u32 ecx u32 malloc sizeof u32 iterations memset ecx 0xBAADF00D sizeof u32 iterations printf 8X n ecx 0
  • 使用 GROUP 和 SUM 的 LINQ 查询

    请帮助我了解如何使用带有 GROUP 和 SUM 的 LINQ 进行查询 Query the database IEnumerable
  • 当另一个线程可能设置共享布尔标志(最多一次)时,是否可以读取共享布尔标志而不锁定它?

    我希望我的线程能够更优雅地关闭 因此我尝试实现一个简单的信号机制 我不认为我想要一个完全事件驱动的线程 所以我有一个工作人员有一种方法可以使用关键部分优雅地停止它Monitor 相当于C lock我相信 绘图线程 h class Drawi

随机推荐

  • 在 PowerShell 中检查 IEnumerable 是否为空

    是否有本地 PowerShell 方法来测试 如果IEnumerable是空的 我知道我可以打电话Linq Enumerable Any像这样 Linq Enumerable Any enumeration 但我希望有一种更本土化的方式 很
  • Google Drive PHP SDK 保存无标题文件

    我正在使用以下函数来插入文件 function insertFile service title description parentId mimeType filename file new DriveFile file gt setTi
  • 带有居中 UISlider 和两个图像的自定义 UITableViewCell

    我想以编程方式创建自定义UITableViewCell with a UISlider在中心和两张图片在任一端 有关示例 请参阅任何 iOS 设备上的亮度设置 它的中心有一个 UISlider 两端有两个类似太阳的图像 一大一小 这基本上就
  • C++ 运行时错误:添加无符号偏移量?

    我写了以下内容来检查文本是否是回文 我在 leetcode 上运行它 但出现错误 class Solution public bool isPalindrome string s int l 0 r s length 1 while l
  • 无法从 Android 中的 onOptionsItemSelected 完成活动

    我正在尝试从菜单选项关闭 活动 当菜单项menu close activity被选中 并且在调试时 我注意到调试器总是从 return true 步骤跳转到默认值 我尝试使用ActivityClassName this finish 但我仍
  • 如何在Recyclerview中实现CountDownTimer?

    您好 我正在开发一个设置倒计时的小应用程序 现在我希望在回收器视图内的背景前看到这个倒计时 因此 最终用户将设置多个倒计时器 这些计时器将在回收器视图中以背景显示 我现在所做的远非完美 但它朝着我想要的方向发展 我现在遇到的唯一问题是 因为
  • 在sencha touch 2中使用oAuth连接facebook

    sencha touch 2 没有提供任何与 facebook 连接的函数 库吗 到目前为止我还不太清楚 我们可以在 sencha touch 中使用 facebook javascript sdk 吗 我发现以下教程很好 我们可以将它与
  • 如何将 Postgres any-clause 与 JPA/Hibernate 本机查询(数组参数)结合使用

    所以我们有大量的 Postgres SQL 查询存储在文件中并从 PHP 中使用 任务是用Java取代PHP 我们希望 按原样 重用尽可能多的查询 以保持迁移路径较短 我无法让数组参数起作用 这是一个查询示例 update user dev
  • 如何创建不会覆盖 META-INF/services 下条目的 fat jar

    我有以下 gradle 构建配置 plugins id com github johnrengelman shadow version 1 2 3 group abc version 1 0 SNAPSHOT apply plugin ja
  • 如何使用 python 读取联系人的 Whatsapp 消息?

    我正在构建一个在指定时间登录 Zoom 的机器人 并且链接是从 Whatsapp 获取的 所以我想知道是否可以直接从 Whatsapp 检索这些链接 而不必将其复制粘贴到 python 中 谷歌充满了发送消息的指南 但是有什么方法可以读取和
  • 将 YYYYMMDD 字符串转换为 MM/DD/YYYY 字符串

    我有一个以 YYYYDDMM 格式存储为字符串的日期 我想以 MM DD YYYY 格式显示该值 我正在用 c 编程 我当前使用的代码如下 txtOC31 Text dr OC31 ToString Trim strOC31date dr
  • 将图像上传到 Google Cloud Storage (Java)

    我想开发一个java应用程序 适用于pc 可以将任何图片上传到谷歌云存储 尽管我花了整个晚上的时间来寻找解决方案 但我不知道如何开始 你们中有人有将图像上传到 Google Cloud Storage 的经验吗 谷歌云存储有更好的替代品吗
  • 将 Matlab 函数结果缓存到文件

    我正在用 Matlab 编写一个模拟 我最终会运行这个模拟数百次 在每次仿真运行中 都有数百万个仿真周期 在每个周期中 我都会计算一个非常复杂的函数 该函数需要 0 5秒完成 函数输入是一个长位数组 gt 1000 位 这是一个数组0 an
  • 如何使用单个命令在 Apache Kafka 中创建主题列表

    截至目前 我正在使用以下命令一一创建一个主题 sh bin kafka topics create zookeeper localhost 2181 topic sdelivery replication factor 1 partitio
  • Java 是否有相当于 C# 的“yield”关键字?

    我知道 Java 本身没有直接的等价物 但也许有第三方 真的很方便 目前我想实现一个迭代器 它生成树中的所有节点 大约有五行带有yield的代码 我知道的两个选项是Aviad Ben Dov 2007 年的 infomancers coll
  • 如何将 LocalDate 转换为 SQL Date Java?

    如何将 LocalDate 转换为java sql Date Attempt Record r new Record LocalDate date new Date 1967 06 22 r setDateOfBirth new Date
  • 如何很好地输出分隔字符串的列表?

    通常 当我必须显示分隔字符串的列表时 我会执行以下操作 using namespace std vector
  • LINQ子查询“NOT IN”问题

    我不明白为什么这个查询失败 var qTags from tagsU in context ADN ProductTagsView where from o in context ADN ProductTagsView where o Pr
  • 如何将数组的内容写入文本文件? C#

    我正在尝试将数组的内容写入文本文件 我已经创建了文件 并将文本框分配给了数组 不确定是否正确 现在我想将数组的内容写入文本文件 Streamwriter 部分是我陷入底部的地方 不确定语法 if File Exists scores txt
  • 什么时候使用哪种指针?

    好吧 上次我以写 C 为生时 std auto ptr所有的标准库都可用吗 boost shared ptr风靡一时 我从未真正研究过 boost 提供的其他智能指针类型 据我所知 C 11 现在提供了 boost 提出的一些类型 但不是全