首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有RTTI的shared_ptr?

没有RTTI的shared_ptr?
EN

Stack Overflow用户
提问于 2016-07-04 09:13:17
回答 1查看 1.6K关注 0票数 7

我试图在一个用shared_ptr 1.34 ( gcc 4.5.2的衍生产品)构建的嵌入式项目中使用xc32。该项目已禁用RTTI与-fno-rtti

代码语言:javascript
复制
#include <memory>

仅包括标题就会给出以下错误:

代码语言:javascript
复制
/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

所以我想知道的是:如果没有RTTI,通常不可能使用shared_ptr,还是我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-04 11:22:00

问题是get_deleter空闲函数:

template D* get_deleter(const shared_ptr& p) T>; 返回:如果p拥有类型为cv-不合格的D类型的删除器d,则返回std:addressof(d);否则返回nullptr。只要存在拥有shared_ptrd实例,返回的指针就仍然有效。

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

另一个有问题的函数是dynamic_pointer_cast,它在存储的指针上调用dynamic_cast

然而,shared_ptr的主要功能可以在不使用RTTI功能的情况下实现,事实上,正如谢尔盖·尼可洛夫( Sergei )上面提到的,gcc 4.8.5附带的shared_ptr-fno-rtti一起工作,但get_deleterdynamic_pointer_cast函数除外;只要您不使用这些工具,就没有理由不能使用shared_ptr。这可以与例如any进行对比,如果不使用typeid,它是无法实现的。

供应商有责任提供一个标准库,该库适用于编译器的所有配置,包括支持使用的非标准配置。但是,如果您的供应商不合作,您仍然有以下几种选择:

  • 修补所提供的标准库以删除已损坏的get_deleter代码;
  • 使用另一个标准库(例如最近的libstdc++或libc++);
  • 使用另一种智能指针工具(例如Boost),或者自己编写一个。
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38180899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档