C++终止错误'std::bad_alloc'

C++ termination error 'std::bad_alloc'

本文关键字:alloc bad 终止 C++ std 错误      更新时间:2023-10-16

当我运行程序进行大量迭代时,我收到以下错误:

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 newoperator delete等。