【问题标题】:C++ termination error 'std::bad_alloc'C++ 终止错误'std::bad_alloc'
【发布时间】:2018-05-27 08:12:03
【问题描述】:

当我运行我的程序进行多次迭代时出现以下错误:

terminate called after throwing an instance of 'std::bad_alloc'

我已阅读并发现这是与内存相关的问题。我正在使用二维向量来存储数据并进行一些处理。每当我将向量传递给另一个函数时,我都会使用&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;
}

【问题讨论】:

  • 可能需要显示更多代码。
  • 你应该检查adj_list[vertex] 至少有两个元素。
  • 顺便说一句:同时拥有“adj_list”和“adjacency_list”是对错误派对的公开邀请。

标签: c++ memory vector


【解决方案1】:

如果您收到 std::bad_alloc,可能意味着以下两种情况之一:

1。您的内存不足

这很容易由内存泄漏引起;也就是说,动态分配内存,然后丢失指向它的最后一个指针,从而无法释放它。您应该使用 valgrind 等工具检查您的程序。

如果您没有泄漏内存,请检查您是否及时释放了您知道不再需要的内存。您无法实际发布您的整个程序,因此我无法提供有针对性的建议,但一般来说,如果您的迭代彼此独立,您应该在迭代完成后和开始下一个迭代之前释放所有资源。等等。

2。您的内存太碎片化,没有空间容纳您当前尝试分配的大对象。

这是一个更难破解的问题,但幸运的是,它也不太可能成为您的问题的原因。但是,如果您发现您的程序实际上是无泄漏的,并且没有占用资源超过必要的时间,那么您也必须尝试解决这种可能性。

为此,您必须考虑您的内存分配模式,修改它们以避免碎片。一种可能是找出您经常分配的对象大小,并为它们创建专用内存池。例如,为您的 48 字节对象分配一个足够大的缓冲区,并自己在此缓冲区中处理它们的分配/释放。要实际实现这一点,您应该查看标准容器的Allocator 模板参数、重载(取消)分配函数operator new 和operator delete 等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多