有哪些好的做法可以帮助在未定义的映射和矢量中预防std::bad_alloc

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

本文关键字:std bad alloc 未定义 帮助 映射      更新时间:2023-10-16

所以我正在制作一个可以读取10000行代码的程序。我有一个向量的无序映射,每一行都会向该无序映射添加数据(可以是新键的形式,也可以是向其中一个向量添加额外数据)。

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

vector <int> temp;

我使用存储数据

temp.push_back(someInt);

然后用把这个矢量存储在我的无序映射中

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

或者我使用将数据添加到其中一个地图矢量

uList[i].push_back(someInt);

每行发生多次这种情况,然后我转到下一行,再做一遍,10000次。

我得到的错误是

"在抛出'std::bad_alloc'的实例后调用terminate">

我认为这是因为我的无序映射或向量在分配内存时出现问题。

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

任何建议都很感激,甚至打电话给我说一些愚蠢的话都会有所帮助!

我认为这里没有足够的信息来了解你为什么会变得糟糕。通常情况下,这只是意味着你的内存不足。

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

我的建议是:发布一个更完整的示例,或者添加一些调试/跟踪,看看在数据结构中创建和存储了多少项。

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