没有RTTI的shared_ptr?

2023-11-23

我正在尝试使用shared_ptr在使用 xc32 1.34(gcc 4.5.2 的衍生版本)构建的嵌入式项目中。该项目已禁用 RTTI-fno-rtti.

#include <memory>

仅包含标题就会出现以下错误:

/Applications/microchip/xc32/v1.34/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/include/Cpp/memory: In member function 'virtual void* std::tr1::_Ref_count_del<_Ty, _Dx>::_Get_deleter(const std::type_info&) const':
In file included from APP/MODULES/LIGHT_MANAGER/LightManager.cpp:13:0:
/Applications/microchip/xc32/v1.34/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/include/Cpp/memory:1264:39: error: cannot use typeid with -fno-rtti
/Applications/microchip/xc32/v1.34/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/include/Cpp/memory: In member function 'virtual void* std::tr1::_Ref_count_del_alloc<_Ty, _Dx, _Alloc>::_Get_deleter(const std::type_info&) const':
/Applications/microchip/xc32/v1.34/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/include/Cpp/memory:1299:39: error: cannot use typeid with -fno-rtti
/Applications/microchip/xc32/v1.34/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/include/Cpp/memory: In function '_Dx* std::tr1::get_deleter(const std::tr1::shared_ptr<_Ty2>&)':
/Applications/microchip/xc32/v1.34/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/include/Cpp/memory:1956:44: error: cannot use typeid with -fno-rtti

所以我想知道的是:一般情况下是不是不能用shared_ptr没有RTTI,或者我做错了什么?


问题是get_deleter免费功能:

template<class D, class T> D* get_deleter(const shared_ptr<T>& p) noexcept;

Returns: If p拥有删除器d类型的cv-不合格D,返回std:addressof(d);否则返回nullptr。只要存在,返回的指针就保持有效shared_ptr拥有的实例d.

显然,最直接的实现就是存储typeid控制块中的删除器。虽然还有其他可能的实现,但它们会 (a) 更加复杂,(b) 失去与启用 RTTI 的代码的二进制兼容性,并且 (c) 违背-fno-rtti.

另一个有问题的函数是dynamic_pointer_cast,这称为dynamic_cast在存储的指针上。

然而,主要功能shared_ptr无需使用 RTTI 功能即可实现,事实上,正如 Sergei Nikulov 上面提到的,shared_ptr随 gcc 4.8.5 一起提供-fno-rtti,除了get_deleter and dynamic_pointer_cast功能;只要您不使用这些设施,就没有理由不能使用shared_ptr。这可以与例如形成对比any,如果不使用则无法实现typeid.

您的供应商有责任提供一个可在其编译器的所有配置中工作的标准库,包括非标准配置(如果他们支持其使用)。但是,如果您的供应商不合作,您仍然有一些选择:

  • 修补提供的标准库以删除损坏的get_deleter code;
  • 使用替代标准库(例如更新的 libstdc++ 或 libc++);
  • 使用替代的智能指针工具(例如 Boost)或自己编写一个。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

没有RTTI的shared_ptr? 的相关文章

  • fork 和 exec 之间的区别

    两者有什么区别fork and exec 指某东西的用途fork and exec它体现了 UNIX 的精神 它提供了一种非常简单的方法来启动新进程 The fork调用基本上复制了当前进程 在almost任何方式 并非所有内容都会被复制
  • 从数组中输入多个数字,每个数字检查是否为整数

    每个人 我希望有人能帮我弄清楚C语言的一些东西 这是我第一次认真地做IT方面的作业 我没有经验 而且我正在电子学习中学习 所以老师的帮助不是很好 我需要用C语言开发控制台应用程序 用户需要输入10个整数 如果插入的数字不是整数 需要输出错误
  • C++ 标准是否允许未初始化的 bool 导致程序崩溃?

    我知道一个 未定义的行为 C 几乎可以让编译器做任何它想做的事情 然而 我遇到了一次令我惊讶的崩溃 因为我认为代码足够安全 在这种情况下 真正的问题仅发生在使用特定编译器的特定平台上 并且仅在启用优化的情况下发生 我尝试了几种方法来重现问题
  • C++ 天花板函数的奇怪结果

    我一直在尝试天花板功能并得到一些奇怪的结果 如果我对十进制数乘以百执行 ceil 运算 我会得到一定的结果 但是 如果我直接对该乘法的结果执行 ceil 我会得到完全不同的输出 另一个问题是 这些不同的结果仅发生在某些数字上 任何帮助 将不
  • OpenGL,如何独立旋转对象?

    到目前为止我的代码 void display void glClear GL COLOR BUFFER BIT GL DEPTH BUFFER BIT Clear Screen And Depth Buffer glLoadIdentity
  • stl 集的 C# 等效项是什么?

    我想使用 C 将一些值存储在平衡二叉搜索树中 我查看了泛型命名空间中的集合 但没有找到与 stl 集合等效的集合 我可以使用什么通用集合 我不想存储键 值对 只是值 你可以使用HashSet http msdn microsoft com
  • 如何在C中将2个4位无符号数组合成1个8位数

    我有 2 个 4 位数字 X0X1X2X3 和 Y0Y1Y2Y3 我想将它们组合起来 这样我就可以创建一个像这样的 8 位数字 X0X1X2X3 Y0Y1Y2Y3 gt X0Y0X1Y1X2Y2X3Y3 我知道如何连接它们以创建X0X1X1
  • File.ReadAllLines 或流读取器

    我们可以使用以下方式读取文件StreamReader http msdn microsoft com en us library vstudio system io streamreader或通过使用File ReadAllLines ht
  • 更新 OSX 命令行工具 6.3 后缺少 C++ 标头 <__debug>

    从 App Store 更新到 Command Line Tools 6 3 后 程序包括
  • 公共领域有哪些替代方案?

    我正在用 java 编写一个游戏 正如问题标题建议的那样 我在类中使用公共字段 暂且 据我所知 公共领域很糟糕 我有一些理解其中的原因 但如果有人能澄清为什么你不应该使用它们 那将不胜感激 问题是 从我所看到的来看 这似乎是合乎逻辑的 是使
  • C++ fill() 与 uninitialized_fill()

    您好 我是初学者 我想知道容器的 fill 和 uninitialized fill 之间的区别 我在谷歌上进行了快速搜索 但没有得到很好的答案 有人可以帮助我吗 fill 将值 使用赋值运算符 分配给已构造的对象 uninitialize
  • 尝试缓冲区溢出

    我正在尝试使用缓冲区溢出来更改函数的结果 以使用以下代码更改堆栈上的结果 include
  • 如何在 .NET 中自定义 JSON 枚举的反序列化?

    我有以下示例 C 代码 它是使用 svcutil exe 应用程序从 xsd 自动生成的 DataContract public enum Foo EnumMember Value bar Bar 1 EnumMember Value ba
  • C++头文件问题

    我在处理类时尝试了一些 C 代码 这个问题出现在我身上 并且让我有点烦恼 我创建了一个包含类定义的头文件和一个包含实现的 cpp 文件 如果我在不同的 cpp 文件中使用此类 为什么要包含头文件而不是包含类实现的 cpp 文件 如果我包含类
  • C# 的 xml 序列化中是否有一个属性可以跳过空数组?

    C 的 xml 序列化中是否有一个属性可以跳过空数组 这将提高 xml 输出的可读性 好吧 你也许可以添加一个ShouldSerializeFoo method using System using System ComponentMode
  • 将纬度/经度转换为 X/Y,以便在美国地图图像上进行阿尔伯斯投影

    我正在尝试使用 C 或 Javascript 将纬度 经度转换为 X Y 坐标 以将带有 CSS 的 div 左 上 定位到美国地图的背景图像上 美国的标准地图投影是阿尔伯斯投影 如下所示 但 StackOverflow 仅提供参考基本墨卡
  • 我们可以使用 C# 录制发送到扬声器的声音吗

    我有一个软件 SoundTap Streaming Audio Recorder 它记录发送到扬声器的任何音频 无论流是来自网络还是来自某些文件或麦克风 我可以在桌面应用程序中制作这样的应用程序 以便我可以录制发送到扬声器的流 无论来源如何
  • Lambda 按值捕获和“mutable”关键字

    关键词的必要性mutable在 lambda 中 是造成极大混乱的根源 考虑代码 int x 10 function
  • 使用 Powershell 或 C# 获取 Azure“文件和文件夹”作业状态

    我一直在尝试找到一种方法来获取在 AzureRM 中运行的几个客户上运行的 文件和文件夹 备份作业的状态 可以在 AzureRm 门户中手动找到状态 恢复服务保管库 gt 作业 gt 备份作业 使用powershell不显示任何作业信息 G
  • InvalidOperationException:没有为方案“CookieSettings”注册身份验证处理程序

    我正在使用 ASP Net MVC core 2 1 开发一个应用程序 其中不断出现以下异常 InvalidOperationException 没有为方案 CookieSettings 注册身份验证处理程序 注册的方案有 Identity

随机推荐

  • 设计和编码 - 从上到下还是从下到上? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 在编码时 根据您的经验 什么是更好的方法 将问题分解为足够小的部分 然后实施每个部分 将问题分解 然后使用自上而下的方法实施 任何其他 我倾向于自上而下设计并自下而上实施 对于实施而言 构
  • 尝试将消息发送到远程队列时 pika.exceptions.ProbableAuthenticationError

    我正在尝试奔跑RabbitMQ Python 教程但发送方位于 virtualbox 主机上 接收方和队列位于 virtualbox 来宾机上 所以我修改了提到的send py仅通过替换代码本地主机 with 192 168 1 5 当我运
  • 如何从菜谱目录的内容生成私有菜谱 JSON?

    我已经开发了一个 Symfony 包 并且正在尝试创建一个配方 在提交之前recipes contrib 我想测试一下 所以我跟着私人食谱说明 不是因为我想要一个私有配方 也就是说 包和配方都不是私有 GitHub 项目意义上的 私有 我已
  • ios编程-格式字符串未使用数据参数

    I get a Data argument not used by format string当我运行以下代码时出错 void pickerView UIPickerView thePickerView didSelectRow NSInt
  • MediaStore:获取图像数据、缩略图和文件夹

    我有两个清单 我们将它们称为AlbumsList 和PicturesList 第一个显示相册封面 其中一张图像 名称和其中的照片数量 第二个显示所选相册中包含的所有图像 我已经使用 File 类完成了此操作 但它运行速度太慢 并且当我只需要
  • 导航栏上方的 android Q 内容

    我们的应用程序的目标是 API 28 并在状态栏下绘制内容 为此 我们使用以下标志和样式 window addFlags FLAG LAYOUT NO LIMITS
  • jquery mobile 中的日期选择器在第二页中添加时是重复的

    我需要一些有关移动应用程序中日期选择器使用的帮助 我在我的应用程序中使用 jQuery UI 日期选择器 但是当我将日期选择器放在第二页时 它会显示两次 重复 但是 当我将日期选择器放在第一页时 显示正常 这是一个示例 如果您运行它 您可以
  • 有没有办法将命名范围组合成新的命名范围?

    I have class Foo lt ActiveRecord Base named scope a lambda a conditions gt a gt a named scope b lambda b conditions gt b
  • url 中的 django 用户名,而不是 id

    在一个迷你虚拟社区中 我有一个 profile view 功能 这样我就可以查看任何注册用户的个人资料 个人资料视图函数将个人资料所属的用户的 id 作为参数 因此当我想访问用户 2 的个人资料时 我会这样调用它 http 127 0 0
  • 如何使用 PowerShell Invoke-RestMethod 发送多部分/表单数据

    我正在尝试通过 Invoke RestMethod 在与带有 F 开关的curl 类似的上下文中发送文件 卷曲示例 curl F FileName path to file name https uri to post 在powershel
  • Elasticsearch节点重启后快速恢复

    考虑 elasticsearch yml 中的以下设置 gateway recover after data nodes 3 gateway recover after time 5m gateway expected data nodes
  • Linux 中对 pthread_create 的未定义引用

    我从网上获取了以下演示https computing llnl gov tutorials pthreads include
  • C++14 中不指定对象的左值

    我在这里使用 N3936 作为参考 如果 C 14 文本有任何不同 请更正此问题 3 10以下左值和右值我们有 每个表达式都属于该分类中的基本分类之一 左值 x值或纯右值 然而 定义lvalue reads An lvalue 指定一个函数
  • C 中的按位连接

    我正在尝试在 C 中连接两个二进制数 所以如果我有1010 and 0011我希望我的结果是10100011 我写了一个我认为可以完成这项工作的简短例程 include
  • Eclipse 优化导入以包括静态导入

    有没有办法让 Eclipse 自动查找静态导入 例如 现在我终于升级到了 Junit 4 我希望能够编写 assertEquals expectedValue actualValue hit Ctrl Shift O and have Ec
  • 重置 svg 填充 css

    我想让所有 svgs 都具有相同的纯色 所以我用 svg fill ccc 但我想在 hover 上获得默认填充 如何禁用填充并恢复默认值 您可以使用以下方法执行此操作 not 并有效地设置 不悬停 的样式 svg not hover fi
  • Jupyter:安装后没有名为“imblearn”的模块

    我在 ANACONDA Navigator 上安装了 imbalanced learn 版本 0 3 1 当我使用 Jupyter Python 3 运行不平衡学习网站上的示例时 from imblearn datasets import
  • Git版本兼容性

    使用 Git 进行版本控制 与不同版本的 Git 协同工作的效果如何 有关的体验 好还是坏 是什么 长话短说 我正在考虑将 Git 用于一些计划的家庭项目 但由于我使用存储库中的默认包进行的大杂烩设置将意味着完全不同的版本 我计划在运行 U
  • 关于 C# 变量作用域与其他语言的问题

    首先声明一下 我以前没用过C 对它了解不多 我正在学习 Sebesta 的 编程语言概念第 9 版 一书 准备 编程语言 考试 当我读到以下摘录自 范围声明顺序 第246页 时 我有点困惑 例如 在 C99 C Java 中 所有局部变量的
  • 没有RTTI的shared_ptr?

    我正在尝试使用shared ptr在使用 xc32 1 34 gcc 4 5 2 的衍生版本 构建的嵌入式项目中 该项目已禁用 RTTI fno rtti include