什么时候使用哪种指针?

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(使用前将#替换为@)

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

  • MVC 重定向到没有控制器的视图

    希望应该是一个简单的 我创建了一个通用错误视图 当整个站点的操作方法内发生异常时 我想显示该视图 我创建了一个部分页面 所有导航都位于其中 因此我不需要在此视图上使用控制器 那么如何从控制器内的操作方法重定向到它 像这样的东西 HttpPo
  • 检查列表是否包含另一个列表。 C#

    编辑 只是说 ContainsAllItem 中的注释解释得最好 很抱歉问这个问题 我知道以前有人问过这个问题 但我只是不明白 好的 所以我想检查一个列表是否包含另一个列表中的所有项目WITHOUT重叠 以及根据类字符串 名称变量 称为项目
  • 切换图片框可见性 C#

    为什么图片框控件的可见性属性在这里不起作用 我最初将它们设置为 false 以便在屏幕加载时它们不可见 但后来我想切换这个 我已完成以下操作 但似乎不起作用 这是一个 Windows 窗体应用程序 private void Action w
  • WebClient读取错误页面的内容

    我有一个加载页面内容的应用程序 我使用 WebClient 类 即使服务器返回 404 500 等错误 我也需要检索内容 我需要这样的东西 WebClient wc new WebClient string pageContent try
  • C# 中的协变和逆变

    首先我要说的是 我是一名正在学习 C 编程的 Java 开发人员 因此 我会将我所知道的与我正在学习的进行比较 我已经使用 C 泛型几个小时了 我已经能够在 C 中重现我在 Java 中知道的相同内容 除了几个使用协变和逆变的示例 我正在读
  • 如何将pdf页面设置设置为打印属性对话框?

    大家好 我想知道如何设置 pdf 页面设置到打印属性对话框 例如 如果我的 PDF 页面设置为横向 则布局会自动显示横向而不是纵向 如果我的 PDF 页面设置为纵向 则布局会自动显示纵向 我在这个主题上做了很多研发 但没有找到任何满意的链接
  • 如何使用汇编获取BIOS时间?

    我正在从头开始实现一个小型操作系统 用于教育目的 现在 我想使用汇编来获取 BIOS 时间 我对此进行了很多搜索 但找不到任何代码示例来执行此操作 如果有人可以提供任何参考或代码示例或与此相关的任何内容 我将非常感激 See 时钟中断 1a
  • 使用反射获取基类的受保护属性值

    I would like to know if it is possible to access the value of the ConfigurationId property which is located in the base
  • 特定设备的不同字体大小

    我目前正在开发通用应用程序 我需要分别处理移动设备和桌面的文本框字体大小 我找到了一些方法 但都不能解决问题 使用 VisualStateManager 和 StateTrigger 为例
  • 使用 openssl 检查服务器安全协议

    我有一个框架应用程序 它根据使用方式连接到不同的服务器 对于 https 连接 使用 openssl 我的问题是 我需要知道我连接的服务器是否使用 SSL 还是 TLS 以便我可以创建正确的 SSL 上下文 目前 如果我使用错误的上下文尝试
  • 在“using”语句中使用各种类型 (C#)

    自从C usingstatements只是try finally dispose 的语法糖 为什么它接受多个对象仅当它们属于同一类型时 我不明白 因为它们需要的只是 IDisposable 如果它们都实现 IDisposable 应该没问题
  • QThread - 使用槽 quit() 退出线程

    我想在线程完成运行时通知对象 但是 我无法让线程正确退出 我有以下代码 处理器 cpp thread new QThread tw new ThreadWorker connect tw SIGNAL updateStatus QStrin
  • 不要声明只读可变引用类型 - 为什么不呢?

    我一直在阅读这个问题 https stackoverflow com questions 2274412 immutable readonly reference types fxcop violation do not declare r
  • 是什么原因导致 Linq 错误:此方法无法转换为存储表达式?

    我有一堆具有相同 select 语句的 Linq to Entity 方法 所以我想我会很聪明 并将其分离到它自己的方法中以减少冗余 但是当我尝试运行代码时 我得到了以下内容错误 该方法不能转化为 商店表达式 这是我创建的方法 public
  • 当在 Repository/UnitOrWork 之上使用 Service 类时,我应该在哪里放置逻辑不适合 Repository 的常用数据访问代码?

    In my 先前的问题 https stackoverflow com questions 24906548 using the generic repository unit of work pattern in large projec
  • C++ 标准中短语“构造函数没有名称”的含义

    在尝试理解 C 标准中的 构造函数没有名称 这句话时 我似乎在 clang 中发现了一个错误 有人可以证实这一点吗 VS2015 and gcc rejects this code and I think they it are is co
  • 你能解释一下这个C++删除问题吗?

    我有以下代码 std string F WideString ws GetMyWideString std string ret StringUtils ConvertWideStringToUTF8 ws ret return ret W
  • 为什么 C# 接口名称前面加上“I”

    这种命名约定背后的基本原理是什么 我没有看到任何好处 额外的前缀只会污染 API 我的想法与康拉德一致response https stackoverflow com a 222502 9898与此相关的question https sta
  • 在何处将 CFLAG(例如 -std=gnu99)添加到 (Eclipse CDT) 自动工具项目中

    我有一个简单的 Autotools C 项目 不是 C 其框架是由 Eclipse CDT Juno 为我创建的 CFLAG 通过检查 似乎是 g O2 我希望所有生成的 make 文件也具有 std gnu99附加到 CFLAG 因为我使
  • 创建带有部分的选项卡式侧边栏 WPF

    我正在尝试创建一个带有部分的选项卡式侧边栏 如 WPF 中的以下内容 我考虑过几种方法 但是有没有更简单 更优雅的方法呢 方法一 列表框 Using a ListBox并将 SelectedItem 绑定到右侧内容控件所绑定的值 为了区分标

随机推荐

  • 在 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 提出的一些类型 但不是全