有哪些好的做法可以帮助在未定义的映射和矢量中预防std::bad_alloc
What are some good practices to help prevent std::bad_alloc in unordered_maps and vectors?
所以我正在制作一个可以读取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位的限制更有可能达到,但仍然相当可观。
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::原子加载和存储都需要吗
- 将对象移动到std::shared_ptr
- 获取错误:在抛出"std::bad::alloc"的实例后终止调用 what(): std::bad_alloc
- "std::vector"在调整大小时引发"bad allocation"异常
- 成员函数 bad() 的 std::ftsream 用于检查
- 正在使用std::string而不是char*bad
- 在抛出 'std::bad _alloc' 的实例后调用终止 what(): std::bad_alloc 在 c++ 中
- What is Scala for: getline(), std::cin.eof(), std::cin.bad()