来自同一原始指针的 C++ 多个唯一指针

2024-03-30

考虑下面我的代码。我对唯一指针的理解是,只能使用一个唯一指针来引用一个变量或对象。在我的代码中,我有多个 unique_ptr 访问同一变量。

这显然不是我所知道的使用智能指针的正确方法,因为指针应该从创建时就拥有完整的所有权。但是,为什么这是有效的并且没有编译错误?谢谢。

#include <iostream>
#include <memory>

using namespace std;

int main()
{
    int val = 0;
    int* valPtr = &val;

    unique_ptr <int> uniquePtr1(valPtr);
    unique_ptr <int> uniquePtr2(valPtr);

    *uniquePtr1 = 10;
    *uniquePtr2 = 20;

    return 0;
}

但是,为什么这是有效的

It is not有效的!这是未定义的行为,因为析构函数std::unique_ptr将释放具有自动存储期限的对象。

实际上,你的程序试图破坏int反对三遍。首先通过uniquePtr2,然后通过uniquePtr1,然后通过val itself.

并且没有编译错误?

因为此类错误通常在编译时无法检测到:

unique_ptr <int> uniquePtr1(valPtr);
unique_ptr <int> uniquePtr2(function_with_runtime_input());

在这个例子中,function_with_runtime_input()可能会执行许多复杂的运行时操作,最终返回指向同一对象的指针valPtr指着。


如果你使用std::unique_ptr正确的话,那么你几乎总是会使用std::make_unique,这可以防止此类错误。

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

来自同一原始指针的 C++ 多个唯一指针 的相关文章

  • 使用链表进行堆排序

    我想知道是否有人曾经使用链表进行堆排序 如果他们可以提供代码 我已经能够使用数组进行堆排序 但尝试在链表中进行排序似乎不切实际 而且在你知道的地方很痛苦 我必须为我正在做的项目实现链接列表 任何帮助将不胜感激 我也用C 答案是 你不想在链表
  • EntityHydrate 任务失败

    我最近安装了 Visual Studio 11 Beta 和 Visual Studio 2010 之后 我无法在 Visual Studio 2010 中构建依赖于 PostSharp 的项目 因此我卸载了 Visual Studio 1
  • 在 C++ 代码中转换字符串

    我正在学习 C 并开发一个项目来练习 但现在我想在代码中转换一个变量 字符串 就像这样 用户有一个包含 C 代码的文件 但我希望我的程序读取该文件并插入将其写入代码中 如下所示 include
  • 在 Mono 中反序列化 JSON 数据

    使用 Monodroid 时 是否有一种简单的方法可以将简单的 JSON 字符串反序列化为 NET 对象 System Json 只提供序列化 不提供反序列化 我尝试过的各种第三方库都会导致 Mono Monodroid 出现问题 谢谢 f
  • Selenium - C# - Webdriver - 无法找到元素

    在 C 中使用 selenium 我试图打开浏览器 导航到 Google 并找到文本搜索字段 我尝试下面的 IWebDriver driver new InternetExplorerDriver C driver Navigate GoT
  • 2个对象,完全相同(除了命名空间)c#

    我正在使用第三方的一组网络服务 但遇到了一个小障碍 在我手动创建将每个属性从源复制到目标的方法之前 我想我应该在这里寻求更好的解决方案 我有 2 个对象 一个是 Customer CustomerParty 类型 另一个是 Appointm
  • 如何修复错误:“检测到无法访问的代码”

    我有以下代码 private string GetAnswer private int CountLeapYears DateTime startDate return count String answer GetAnswer Respo
  • Linux 上的 RTLD_LOCAL 和dynamic_cast

    我们有一个由应用程序中的一些共享库构成的插件 我们需要在应用程序运行时更新它 出于性能原因 我们在卸载旧插件之前加载并开始使用新插件 并且只有当所有线程都使用旧插件完成后 我们才卸载它 由于新插件和旧插件的库具有相同的符号 我们dlopen
  • 条件类型定义

    如果我有一小段这样的代码 template
  • 如何防止 Blazor NavLink 组件的默认导航

    从 Blazor 3 1 Preview 2 开始 应该可以防止默认导航行为 https devblogs microsoft com aspnet asp net core updates in net core 3 1 preview
  • 如何在多线程应用程序中安全地填充数据并 Refresh() DataGridView?

    我的应用程序有一个 DataGridView 对象和一个 MousePos 类型的列表 MousePos 是一个自定义类 它保存鼠标 X Y 坐标 类型为 Point 和该位置的运行计数 我有一个线程 System Timers Timer
  • ASP.NET Core 中间件与过滤器

    在阅读了 ASP NET Core 中间件之后 我对何时应该使用过滤器以及何时应该使用中间件感到困惑 因为它们似乎实现了相同的目标 什么时候应该使用中间件而不是过滤器 9频道有一个关于此的视频 ASP NET 怪物 91 中间件与过滤器 h
  • 使用 gcc 时在头文件中查找定义的好方法是什么?

    在使用 gcc 时 有人有推荐的方法在头文件中查找定义吗 使用 MSVC 时 我只需右键单击并选择 转到定义 这非常好 我使用过 netbeans gcc 它确实有代码帮助 包括到定义的超链接 所以这是一种选择 但是 我想知道是否有任何其他
  • 如何获取带有某个属性注释的所有属性?

    我刚刚从 Roslyn 开始 我想找到所有用属性名称 OneToOne 注释的属性 我启动了 SyntaxVisualizer 并能够获取对该节点的引用 但我想知道是否有更简单的方法来实现此目的 这就是我所拥有的 var prop docu
  • 任何人都可以清楚地告诉如何在不使用像 这样的预定义函数的情况下找到带有小数值或小数值的指数吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 例如 2 0 5 1 414 所以想要 我是 c 的新手 所以请解释简单的逻辑 如果不是复杂的逻辑也足够了 在数学中 从整数取幂到实数
  • Streamwriter 覆盖 txt 文件中的文本

    有没有什么方法可以重新打开流写入器而不创建新的写入对象 因为此时 当调用 WriteOdd 时 streamwriter 正在覆盖在它之前调用的 WriteEven public void WriteEven StreamWriter wr
  • 从后面的代码添加外部 css 文件

    我有一个 CSS 文件 例如 SomeStyle css 我是否可以将此样式表文档从其代码隐藏应用到 aspx 页面 您可以将文字控件添加到标头控件中 Page Header Controls Add new System Web UI L
  • 声明一个负长度的数组

    当创建负长度数组时 C 中会发生什么 例如 int n 35 int testArray n for int i 0 i lt 10 i testArray i i 1 这段代码将编译 并且启用 Wall 时不会出现警告 并且似乎您可以分配
  • ContentDialog Windows 10 Mobile XAML - 全屏 - 填充

    我在项目中放置了一个 ContentDialog 用于 Windows 10 上的登录弹出窗口 当我在移动设备上运行此项目时 ContentDialog 未全屏显示 并且该元素周围有最小的填充 在键盘上可见 例如在焦点元素文本框上 键盘和内
  • 如何在 ASP.NET Core 中注入泛型的依赖关系

    我有以下存储库类 public class TestRepository Repository

随机推荐

  • 如何将字符串/数字附加到字符串?

    我有一个函数 void generateLevelFromPlist int currentLevel NSString mainPath NSBundle mainBundle bundlePath itemPositionPlistLo
  • python,pandas,按条件删除行

    您好 我需要帮助根据条件删除一些行 如果估计价格减去价格超过 1500 正 则删除该行 price estimated price 0 13295 13795 1 19990 22275 2 7295 6498 例如只有索引 1 会被删除
  • 如何在关系中设置主键?

    我想知道如何正确设置主键 in a Relation 例如 我们有ER图其中包含元素 关键属性 关键属性较弱 识别关系 关联实体 为了将其翻译成关系模型我们应该做一些技巧 上面的所有元素都处理关系的主键 但它们都是自然键 这样我们就可以离开
  • 下载 PMC 和 PubMed 数据库中的所有全文文章

    根据 NCBI Help Desk 回答的问题之一 我们无法 批量下载 考研中心 但是 我可以使用 NCBI E utilities 下载吗allPMC 数据库中的全文论文使用Efetch或者至少使用以下命令找到所有相应的 PMCidEse
  • 是否可以使用 jQuery(或其他库)*不*滚动 div ?

    我想以编程方式滚动 divwithout使用任何库 可能吗 如果可能的话 如何实现 谢谢 是的 var myEl document getElementById myEl myEl scrollLeft 12 myEl scrollTop
  • 测试当前目录是否在 Rails 项目内 (bash)

    有没有一种简单的方法来测试当前目录是否在 Rails 项目内 显然 Rails 本身对此进行了测试 以便使用 Rails 子命令 生成 脚手架等 因此大概有一种直接的方法来测试这一点 我正在寻找与您类似的东西测试您是否在 Git 存储库中
  • 如何确定Compact Framework 3.5中dll文件的文件版本[重复]

    这个问题在这里已经有答案了 我想在指定路径时确定 c 中 dll 文件的文件版本 假设 path x y z dll 给定路径时如何查找 z dll 的文件版本 注意 我使用 Compact Framework 3 5 SP1 Get th
  • Bootbox 警报框中的新行

    我想在我的 Bootbox Alert Box 中新建一行 我知道在 Javascript 中你可以使用 n但这似乎不起作用 这是我尝试过的 bootbox alert Hello n world 您可以使用 html 来实现 bootbo
  • printf 中可以使用指向字符串的指针吗?

    我在想这样的事情 include
  • 使用角度材质 2 输入的自定义样式

    我正在尝试设计输入的样式 使其具有一定的宽度 我正在使用 Angular Material 2 但由于某种原因 css 中的样式没有应用于输入标签 这是我的问题的一个工作插件 http plnkr co edit qHbyig0gHtxdq
  • 解耦(并行处理)Web 应用程序的非立即进程的最佳方法?

    我正在寻找一种好的策略来真正解耦我的 Web 应用程序 ASP NET MVC C 的非立即进程 以进行并行处理 我将非立即定义为不需要立即完成以呈现页面或更新信息的所有事情 这些过程包括发送电子邮件 根据数据库信息更新一些内部统计数据 从
  • 从 dymola 模型获取高质量图片

    我需要从 dymola 的建模对象中获得相当好的图像 由于模型的尺寸 截取屏幕截图 使用截图工具会导致图片质量非常差 有没有办法导出我在dymola中画的 图片 您可以将模型导出为可扩展和可编辑的 SVG 图像 此致 雷内 贾斯特 尼尔森
  • 有没有办法将 Unicode 文本存储在配置为“US7ASCII”的 Oracle 数据库中

    我们最近遇到了一个障碍 即商标符号从一个 Oracle 数据库复制到另一个数据库 但它看起来像 我们已将问题跟踪到配置了 US7ASCII 字符集的目标数据库 不幸的是 我们目前无法重建数据库来解决这个问题 有没有一种方法可以定义特定列来使
  • C++ 3sum 复杂度

    我试图解决cpp中的3和问题 给定一个由 n 个整数组成的数组 S S 中是否存在满足 a b c 0 的元素 a b c 查找数组中所有总和为零的唯一三元组 class Solution public vector
  • WxPython:符合“确定”/“取消”按钮顺序的跨平台方式

    我正在学习 wxPython 所以大多数库和类对我来说都是新的 我正在创建一个首选项对话框类 但不知道确保 确定 取消 或 保存 关闭 按钮在平台上的顺序正确的最佳方法 该程序旨在在 GNOME 和 Windows 上运行 因此我想确保每个
  • rdi 寄存器用于无参数函数的目的

    考虑这个简单的函数 struct Foo int a int b int c int d int e int f Foo foo Foo f f a 1 f b 2 f c 3 f d 4 f e 5 f f 6 return f 它生成以
  • 无法为 Linux Redhat 服务器上安装的 R studio 安装 Devtools 包

    我无法安装devtools在 Redhat Linux 服务器上的 R Studio 中打包 这些错误消息出现 ERROR configuration failed for package RCurl removing home xx R
  • Stripe CLI ubutu 安装问题

    我想在 ubuntu 20 04 上安装 Stripe CLI 我按照 Stripe 文档中的步骤安装 从以下位置下载最新的 linux tar gz 文件https github com stripe stripe https githu
  • 如何使用 Jetty 客户端获取基于请求的连接所花费的时间

    我想计算根据要求请求开始和连接建立 TCP 连接建立 之间的时间 我问了这个问题question https stackoverflow com questions 66605208 how to get the time it took
  • 来自同一原始指针的 C++ 多个唯一指针

    考虑下面我的代码 我对唯一指针的理解是 只能使用一个唯一指针来引用一个变量或对象 在我的代码中 我有多个 unique ptr 访问同一变量 这显然不是我所知道的使用智能指针的正确方法 因为指针应该从创建时就拥有完整的所有权 但是 为什么这