有哪些好的做法可以帮助防止 unordered_maps 和向量中的 std::bad_alloc?

What are some good practices to help prevent std::bad_alloc in unordered_maps and vectors?

所以我正在制作一个读取 10,000 行代码的程序。我有一个 unordered_map 向量,每一行都向 unordered_map 添加数据(以新密钥的形式或向其中一个向量添加额外数据)。

对于每一行,我都使用 emplace 存储数据。例如,我有一个

vector <int> temp;

我在使用中存储数据

temp.push_back(someInt);

然后将该向量存储在我的 unordered_map 中

uList.emplace(someKey, temp);
temp.clear();

或者我使用

将数据添加到地图矢量之一
uList[i].push_back(someInt);

这种情况每行发生多次,然后我转到下一行并重新做一遍,10,000 次。

我得到的错误是

"terminate called after throwing an instance of 'std::bad_alloc'"

我假设这是因为我的 unordered_map 或我拥有的向量分配内存时出现问题。

我的问题是:如果我使用 .emplace() 次数太多,unordered_map 是否会在分配内存时出现问题,是否有任何常见做法可用于防止向量分配错误或无序地图?

感谢任何建议,即使是骂我说些蠢话也会有所帮助!

我认为这里没有足够的内容来了解​​您为什么会得到 bad_alloc。通常它只是意味着您 运行 内存不足。

我的第一个想法是,您的分配比您想象的要多得多,这存在逻辑问题。我还想知道是否为无序映射生成的哈希值很差,导致您插入更多元素而不是更新现有元素的列表。

我的建议:post 更完整的示例,或添加一些 debugging/tracing 以查看在您的数据结构中创建和存储了多少项目。

此外,您的进程在终止前消耗了多少内存?具有虚拟内存的操作系统上的现代(尤其是 64 位)进程 运行ning 可以在失败之前分配大量内存。更有可能达到 32 位的限制,但仍然相当可观。