首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >libc++是否维护内部状态?

libc++是否维护内部状态?
EN

Stack Overflow用户
提问于 2015-02-23 18:24:36
回答 1查看 146关注 0票数 1

libc++是否维护了一个进程范围内的内部状态,其中发生在代码某一部分中的操作可以通过调用std::*类(例如std::set)影响代码的某些遥远部分?更确切地说,我看到了类似这样的崩溃(只显示堆栈跟踪的顶部):

std::__1::__tree<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >::__insert_unique(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) + 156, stop reason = EXC_BAD_ACCESS (code=1, address=0x0)

修复方法是升级一个与崩溃无关的库,以纠正C++ ABI问题。我只是感到惊讶的是,ABI问题可能会产生远离原因的影响,并且怀疑标准库本身是否存在某种状态损坏?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-23 18:40:24

C++不提供受保护的环境。如果代码的任何部分做了一些被禁止的事情(例如删除一个对象两次,取消数组的限制.)那么,代码的任何其他位置都可以执行任何操作,无论是立即执行,还是经过很长一段时间之后。

实际上,问题往往是错误显然不会造成任何伤害,因为程序(显然)只是起作用了。

关于违反ABI的错误非常低(例如,可能需要机器代码来保存特定的寄存器,但它不需要),而且您没有什么可惊讶的。欢迎来到“未定行为”地狱。

在特定的std::setstd::map中,已知某些实现依赖于哨兵,因此覆盖全局变量甚至会影响以后创建的映射和集合。

而且,C++中的几乎所有东西都依赖于动态分配的内存,而违反ABI的程序可能破坏与此相关的数据结构,其效果可能在以后显示数百万条执行的指令(例如,损坏的空闲块被重新分配用于其他事情时)。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28680694

复制
相关文章

相似问题

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