如何声明 std::unique_ptr 以及它有什么用?

2023-12-30

我试着去理解如何std::unique_ptr有效,为此我发现this http://www.codeguru.com/cpp/article.php/c17775/The-Smart-Pointer-That-Makes-Your-C-Applications-Safer--stduniqueptr.htm文档。作者从下面的例子开始:

#include <utility>  //declarations of unique_ptr
using std::unique_ptr;
// default construction
unique_ptr<int> up; //creates an empty object
// initialize with an argument
unique_ptr<int> uptr (new int(3));
double *pd= new double;
unique_ptr<double> uptr2 (pd);
// overloaded * and ->
*uptr2 = 23.5;
unique_ptr<std::string> ups (new std::string("hello"));
int len=ups->size();

让我感到困惑的是,在这一行中

unique_ptr<int> uptr (new int(3));

我们使用整数作为参数(在圆括号之间),这里

unique_ptr<double> uptr2 (pd);

我们使用指针作为参数。有什么区别吗?

我还不清楚的是,以这种方式声明的指针与以“正常”方式声明的指针有何不同。


的构造函数unique_ptr<T>接受指向类型对象的原始指针T(因此,它接受T*).

在第一个示例中:

unique_ptr<int> uptr (new int(3));

指针是a的结果new表达式,而在第二个示例中:

unique_ptr<double> uptr2 (pd);

该指针存储在pd多变的。

从概念上讲,没有任何改变(您正在构建一个unique_ptr来自原始指针),但第二种方法可能更危险,因为它允许您执行以下操作:

unique_ptr<double> uptr2 (pd);
// ...
unique_ptr<double> uptr3 (pd);

因而有two有效封装同一对象的唯一指针(从而违反了unique指针)。

这就是为什么在可能的情况下创建唯一指针的第一种形式更好的原因。请注意,在 C++14 中我们将能够执行以下操作:

unique_ptr<int> p = make_unique<int>(42);

这既更清晰又更安全。现在针对您的这个疑问:

我还不清楚的是,以这种方式声明的指针与以“正常”方式声明的指针有何不同。

智能指针应该对对象所有权进行建模,并在指向该对象的最后一个(智能的、拥有的)指针超出范围时自动销毁所指向的对象。

这样你就不必记住做什么delete在动态分配的对象上 - 智能指针的析构函数将为您执行此操作 - 也不用担心您是否不会取消引用指向已被销毁的对象的(悬空)指针:

{
    unique_ptr<int> p = make_unique<int>(42);
    // Going out of scope...
}
// I did not leak my integer here! The destructor of unique_ptr called delete

Now unique_ptr是一个模拟唯一所有权的智能指针,这意味着在您的程序中的任何时候都只能有one(拥有)指向所指向对象的指针 - 这就是为什么unique_ptr是不可复制的。

只要您使用智能指针的方式不违反它们要求您遵守的隐式契约,您就可以保证不会泄漏内存,并且将强制执行对象的正确所有权策略。原始指针不给你这样的保证。

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

如何声明 std::unique_ptr 以及它有什么用? 的相关文章

  • 如何在 C++ 中的文件末尾添加数据?

    我已按照网上的说明进行操作 此代码应该将输入添加到文件 数据库 的末尾 但当我检查时 数据会覆盖现有数据 请帮忙 这是我的代码 int main string name string address string handphone cou
  • 在 C# 中创建具有单独列的分隔文本

    我一直在尝试在 C 中创建一个制表符限制的文本文件 以便数据正确显示在单独的列中 Firstname Lastname Age John Smith 17 James Sawyer 31 我尝试过 t 字符 但我得到的只是 Firstnam
  • 启动时出现 OData v4 错误:找不到段“Whatever”的资源

    我正在构建新的 v4 服务 一切进展顺利 直到我为新模型 实体添加了新控制器 并在启动站点进行测试运行时收到此错误 控制器似乎编码正确 就像其他控制器一样 控制器 CustomersOData 中的操作 GetFeed 上的路径模板 Cus
  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • 将内置类型转换为向量

    我的 TcpClient 类接受vector
  • 互斥体实现可以互换(独立于线程实现)

    所有互斥体实现最终都会调用相同的基本系统 硬件调用吗 这意味着它们可以互换吗 具体来说 如果我使用 gnu parallel算法 使用openmp 并且我想让他们称之为线程安全的类我可以使用boost mutex用于锁定 或者我必须编写自己
  • 如何从 .resx 文件条目获取注释

    资源文件中的字符串有名称 值和注释 The ResXResourceReader类让我可以访问名称和值 有办法看评论吗 你应该能够得到Comment via ResXDataNode class http msdn microsoft co
  • 用于检查项目文件中的项目变量和引用路径的 api

    我正在研究一个 net application VS2010 与 x 没有 解和变量号这些解决方案中的项目数量 我需要检查项目属性 特定于一定数量的项目 是否同质 并且检查 验证构建期间的参考路径 有没有一个API是这样的吗 如果没有 我该
  • ASP.NET:获取自 1970 年 1 月 1 日以来的毫秒数

    我有一个 ASP NET VB NET 日期 我试图获取自 1970 年 1 月 1 日以来的毫秒数 我尝试在 MSDN 中寻找方法 但找不到任何东西 有谁知道如何做到这一点 从 NET 4 6 开始 该方法ToUnixTimeMillis
  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • 如何在 Blackberry Cascades 中显示具有特定号码的电话板

    我正在使用带有 C QT 和 QML 的 Blackberry Cascades 10 Beta 3 SDK 以及 Blackberry 10 Dev Alpha Simulator 和 QNX Momentics IDE 并且我正在尝试实
  • 如何将自定义 JSON 文件添加到 IConfiguration 中?

    我正在使用 asp net Autofac 我正在尝试加载自定义 JSON 配置文件 并基于该文件创建 实例化 IConfiguration 实例 或者至少将我的文件包含到默认情况下构建的 IConfiguration asp net 中
  • 如何使用 Mongodb C# 驱动程序连接多个集合

    我需要将 3 个集合与多个集合合并在一起 lookup我在 C 驱动程序中尝试过 它允许我 lookup用户采集但无法执行秒 lookup用于设置集合 有人可以帮忙吗 db Transactions aggregate lookup fro
  • 如何编写一个同时需要请求和响应Dtos的ServiceStack插件

    我需要提供本地化数据服务 所有本地化的响应 Dto 都共享相同的属性 IE 我定义了一个接口 ILocalizedDto 来标记那些 Dto 在请求端 有一个ILocalizedRequest对于需要本地化的请求 Using IPlugin
  • 用于 C# 的 TripleDES IV?

    所以当我说这样的话 TripleDES tripledes TripleDES Create Rfc2898DeriveBytes pdb new Rfc2898DeriveBytes password plain tripledes Ke
  • 有没有办法强制显示工具提示?

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

    有时需要将字符串的长度与常量进行比较 例如 if line length gt 2 Do something 但我试图避免在代码中使用 魔法 常量 通常我使用这样的代码 if line length gt strlen Do somethi
  • Linq-to-entities,在一个查询中获取结果+行数

    我已经看到了有关此事的多个问题 但它们已经有 2 年 或更长 的历史了 所以我想知道这方面是否有任何变化 基本思想是填充网格视图并创建自定义分页 所以 我还需要结果和行数 在 SQL 中 这将类似于 SELECT COUNT id Id N
  • 使用 GhostScript.NET 打印 PDF DPI 打印问题

    我在用GhostScript NET http ghostscriptnet codeplex com打印 PDF 当我以 96DPI 打印时 PDF 打印效果很好 但有点模糊 如果我尝试以 600DPI 打印文档 打印的页面会被极大地放大
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi

随机推荐

  • 如何使用 C# 或 XAML 创建自动动画轮播循环图像?

    我已经在 Web 开发中完成了轮播 但通过 XAML 或 C 在 WPF 中为它们设置动画对我来说是新鲜事 网上有一些例子 但它们要么已经过时 要么不是我想要的 即使当我玩弄其他项目的源代码时 这也不是我所希望的 我想让图像自动从左到右 水
  • Android webview中的无限滚动

    我有一些本地 html 文件 我想用无限滚动方法显示它们 NOTE 我无法更改 html 内容 所以请不要建议向其中添加 javascript 我必须在运行时执行此操作 所以 我发现我可以执行javascript在运行时通过loadUrl
  • 生成的 pdf 中的文本是反向的

    我正在使用 pdfbox 向 pdf 文件添加一行 但我添加的文字是相反的 File file new File filePath PDDocument document PDDocument load file PDPage page d
  • 如何从 Magento-1 价格中删除小数点?

    我在搜索中找到的只是一个编程解决方案 我知道我们可以修改 lib Zend Locale Data en xml 以用于英语商店 en xml中有这部分
  • 我们可以在每个 上方的 table 内添加 div 吗?

    您好 我正在尝试在每个上面添加一个 div tr 但是当我查看 html 控制台时 div 显示在表格之外 下面是html代码 table div tr td td tr div div tr td td tr div table 这是不允
  • 计算方法的执行时间

    可能的重复 如何测量函数运行的时间 https stackoverflow com questions 10107140 how to measure how long is a function running 我有一个 I O 计时方法
  • 如何在Google App Engine灵活环境中运行TensorFlow?

    之前我问为什么GAE在这里找不到TensorFlow libhttps stackoverflow com questions 40241846 why googleappengine gives me importerror no mod
  • Rails 5 处理 ActionController::ParameterMissing 的方法

    如果使用强参数缺少所需的参数 Rails 服务器将使用 HTTP 500 进行响应 这并不能让我控制向用户反馈到底出了什么问题 能够向他们发送缺少所需参数的消息是否没有意义 提供适当用户反馈的 Rails 方式 是什么ActionContr
  • SQLite 中的“如果不存在则插入”语句

    我有一个 SQLite 数据库 我正在尝试插入值 users id lessoninfo id 表中bookmarks 仅当两者之前不连续存在时 INSERT INTO bookmarks users id lessoninfo id VA
  • 如何更改另一个进程的内存空间中的值

    如果你能帮助我解决这个困境 现在 我知道C C 我知道asm 我知道dll注入 我知道虚拟内存寻址 但我就是不知道如何 像 CheatEngine 等软件可以在另一个进程中更改变量的值 对于那些不知道的人来说 第 3 方作弊引擎工具可以扫描
  • Python 的单元测试可以像鼻子一样并行测试吗?

    Python的NOSE测试框架有以下概念并行运行多个测试 https nose readthedocs io en latest plugins multiprocess html 这样做的目的不是为了测试代码中的并发性 而是为了让 没有副
  • 在 Eclipse 中禁用“下载源代码和 javadoc”

    我正在使用 Eclipse 20210312 0638 我已从首选项 第一张图片 中取消选中 下载工件源 和 下载工件 javadoc 它仍在下载它们 第二张图片 我还应该更改其他配置吗 有人已经修复了 Eclipse 中的一个错误 htt
  • 仅当字符串中存在小写字母时,使用一个正则表达式匹配所有大写单词

    我偶然发现了这个看似微不足道的问题 但我却被困住了 我有一个字符串 我想在其中匹配在一个正则表达式中全部大写单词only如果字符串中的某个位置至少有一个小写字母 基本上 我希望每一行 我们可以考虑将正则表达式分别应用于每一行 不需要进行一些
  • 致命:不是有效的对象名称:'master'

    我有一个运行 git 1 7 的私人服务器 当我 git init 它不会创建主分支的文件夹 因为当我这样做时 git branch 它没有列出任何内容 当我做 git bare init 它创建文件 当我打字时 git branch ma
  • 如何在 Unity Shader 中实现简单的高度图

    首先我要说的是我对着色器编程知之甚少 我这里的很多内容都是由在线资源和现有资产拼接而成的 我只需要知道如何将高度图正确集成到统一着色器中 它不必比标准 Unity 着色器更复杂 我无法使用标准着色器 因为我需要一个将多个纹理平铺在一起的着色
  • 无法使用 create-react-app 创建应用程序

    当我尝试使用创建应用程序时创建反应应用程序给出一个错误 error 电子邮件受保护 cdn cgi l email protection 引擎 节点 与此不兼容 模块 预期版本 6 14 0 8 10 0 gt 9 10 0 错误 发现不兼
  • 如何从 javascript 调用 cfm 页面上的 cffunction?

    我想知道我是否可以打电话cffunction在我的 cfm 页面上 我有onClick按钮应该调用cffunction这是在同一页上 我也尝试过cfcomponent围绕我的函数 但我收到此错误 Invalid CFML construct
  • 以编程方式将行添加到无界 datagridview

    我将值从一种表单发送到另一种表单 然后想在 dgv 中显示 我正在尝试这个 执行过程中没有错误 bt 它没有在 dgv 中显示数据 lineItemsDGV Rows Add int RowIndex lineItemsDGV RowCou
  • 什么是用于在 Python 中验证文件的优秀音频库?

    我已经在检查内容类型 大小和扩展名 Django 音频 文件验证 https stackoverflow com questions 6194901 django audio file validation 但我需要一个库来读取该文件并确认
  • 如何声明 std::unique_ptr 以及它有什么用?

    我试着去理解如何std unique ptr有效 为此我发现this http www codeguru com cpp article php c17775 The Smart Pointer That Makes Your C Appl