C++终止错误'std::bad_alloc'
C++ termination error 'std::bad_alloc'
当我运行程序进行大量迭代时,我收到以下错误:
terminate called after throwing an instance of 'std::bad_alloc'
我已经阅读并发现这是一个与内存相关的问题。我正在使用 2d 矢量来存储数据并进行一些处理。每当我将向量传递给另一个函数时,我都会使用&vector_name
,并且无法确定发生了什么。
我应该在每次迭代处理后使用vector_name.clear();
?我正在做 1000 + 次,所以这会有所帮助吗?关于我可以检查的任何其他指示将不胜感激。
异常在 for 循环结束时引发。
for (int i = 0; i <= 10000; i++){
init_increasing_list = std::vector<int>(adj_list[vertex].begin() + 1, adj_list[vertex].end());
candidate = MaxClique(initial_vertex, initial_increasing_list, adj_list);
if (candidate.size() > max_size){
max = candidate;
max_size = max.size();
std::cout << max_size << std::endl;
}
std::cout << "Loop ended" << std::endl;
}
如果你得到std::bad_alloc
,这可能意味着以下两件事之一:
1. 内存不足
这很容易由内存泄漏引起;也就是说,动态分配内存,然后丢失指向它的最后一个指针,因此无法解除分配。您应该使用valgrind之类的工具检查您的程序是否存在这些。
如果您没有泄漏内存,请检查您是否立即释放了您知道不再需要的内存。你无法现实地发布你的整个程序,所以我不能提供有针对性的建议,但一般来说,如果你的迭代彼此独立,你应该在迭代完成后和开始下一个迭代之前释放所有资源。等。
2.你的记忆太碎片化,没有空间容纳你目前试图分配的大物体。
这是一个更难破解的难题,但幸运的是,它也不太可能成为导致您问题的原因。但是,如果您发现您的程序实际上没有泄漏并且占用资源的时间不超过必要的时间,那么您也必须尝试攻击这种可能性。
为此,您必须考虑内存分配模式,修改它们以避免碎片。一种可能性是找出您经常分配的对象大小,并为它们创建专用内存池。例如,为 48 字节对象分配足够大的缓冲区,并在此缓冲区内自行处理它们的分配/释放。要实际实现这一点,您应该查看标准容器的Allocator
模板参数、重载(反(分配函数operator new
和operator delete
等。
相关文章:
- 使用来自 Excel VBA 的 C++ dll 时"Bad DLL calling convention" - 如何解决?
- C++17 编解码器在将标准::字符串转换为标准::字符串时抛出"bad conversion"
- 对于代理容器上的迭代器来说,"least bad implementation"可能是什么?
- 组件对象模型 (COM):IMalloc::Alloc 在哪里分配内存?
- 获取错误:在抛出"std::bad::alloc"的实例后终止调用 what(): std::bad_alloc
- 为什么 GetSystemMetrics (SM_CXVIRTUALSCREEN) 返回'bad'值?
- 将 lambda 传递给 STL 集时出错"bad function call"
- 新的 C++14 位分隔符处"Bad Character" Eclipse Oxygen 错误
- 使用 #define 被认为是"bad practice"吗?
- "400 Bad request"使用 OpenSSL BIO 进行请求时
- CGAL:Hausdorff距离不良Alloc
- 解密文件AES_256_CBC返回"bad decrypt"错误
- 在C++流中,eof(),fail(),bad()和good()有什么区别
- C STD ::初始化类对象中的Alloc错误错误
- make / gcc:"bad build"的可能原因是什么?
- 什么是地址0xbaddc0dedeadbead "Bad decode dead bead"
- 在多线程环境中,什么可能导致"bad file descriptor"?
- 尝试解决HackerBank上的BFS挑战时出现错误的alloc异常
- "std::vector"在调整大小时引发"bad allocation"异常
- 尝试使用 execp、dup2 和管道实现 shell,挂起或"bad file descriptor"