【发布时间】:2015-02-23 18:24:36
【问题描述】:
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 问题可能会产生与原因相去甚远的影响,并且想知道标准库本身是否存在某些状态已损坏?
【问题讨论】:
-
全局
operator new和operator delete维护每个进程的堆。它们被std::allocator使用,因此(默认情况下)任何分配内存的标准类都使用它们,并且似乎与这里有关。破坏堆可能会破坏使用它的任何其他代码。 -
std::__1的错误通常意味着您使用的是 LLVM 的 libc++,而不是 GNU 的 libstdc++。 -
@Macmade 好点让我稍后重新安排我的问题...