【发布时间】:2018-08-01 09:32:04
【问题描述】:
我似乎在 Release 模式 (-O3) 的 MacOS/AppleClang 上遇到 boost::container::flat_multimap (Boost 1.66.0) 的问题。我在 Ubuntu 17.10/GCC7.2 和 Oracle Linux/GCC7.2.1 中测试过,问题没有出现。
下面是一个最小可重现的例子。
代码:
#include <iostream>
#include <vector>
#include <boost/container/flat_map.hpp>
using multimap = boost::container::flat_multimap<int *, int>;
int main(int argc, char **argv)
{
multimap map;
std::vector<std::pair<int *, int>> key_value_pairs;
for (int k = 0; k < 2; k++) {
int * new_int = new int;
*new_int = k;
map.emplace(new_int, k);
key_value_pairs.emplace_back(new_int, k);
}
for (auto it = map.begin(); it != map.end();) {
if (it->first == key_value_pairs[0].first) {
it = map.erase(it);
} else {
++it;
}
}
// Should only be one map element left (key_value_pairs[1])
auto it = map.find(key_value_pairs[1].first);
if (it == map.end()) {
throw std::logic_error("Could not find key");
}
std::cout << "Success!" << std::endl;
return EXIT_SUCCESS;
}
Clang 版本
hoc$ clang --version
Apple LLVM version 9.0.0 (clang-900.0.39.2)
Target: x86_64-apple-darwin17.4.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
在本例中,我们生成 2 个 int 指针并将它们作为键插入到 boost::container::flat_multimap 中。然后我们遍历映射并通过识别键来删除其中一个条目。随后我们尝试通过key找到未擦除的元素,但有时找不到(有时会触发第31行的std::logic_error)。
我的代码有错误吗?还是容器?
【问题讨论】: