当我运行我的程序进行大量迭代时,我收到以下错误:
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;
}
答案 0 :(得分:0)
如果您获得std::bad_alloc
,则可能意味着以下两种情况之一:
这很容易造成内存泄漏;也就是说,动态分配一个内存然后丢失它的最后一个指针,这样它就不能被释放了。您应该使用诸如valgrind之类的工具检查您的程序。
如果您没有泄漏记忆,请检查您是否及时释放了您不再需要的记忆。你不能真实地发布你的整个程序,所以我不能提供有针对性的建议,但一般来说,如果你的迭代是相互独立的,你应该在迭代完成之后和开始下一个之前释放所有资源。等
这是一个难以破解的坚果,但幸运的是,它不太可能成为你问题的原因。但是,如果您发现您的程序实际上没有泄漏且没有超过必要的时间来保留资源,那么您也必须尝试攻击这种可能性。
为此,您必须考虑内存分配模式,修改它们以避免碎片。一种可能性是找出您经常分配的对象大小,并为它们创建专用的内存池。例如,为48字节对象分配一个足够大的缓冲区,并自己处理它们在此缓冲区中的分配/释放。要实际实现这一点,您应该查看标准容器的Allocator
模板参数,重载(de)分配函数operator new
和operator delete
等等。