Ошибка завершения C ++ 'std :: bad_alloc' - PullRequest
0 голосов
/ 27 мая 2018

Я получаю следующую ошибку, когда запускаю свою программу много раз:

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;
}

1 Ответ

0 голосов
/ 27 мая 2018

Если вы получаете std::bad_alloc, это может означать одно из двух:

1.Вам не хватает памяти

Это может быть легко вызвано утечкой памяти;то есть, динамически выделяя память, а затем теряя последний указатель на нее, так что она не может быть освобождена.Вы должны проверить свою программу на это, используя такой инструмент, как valgrind.

Если у вас нет утечки памяти, проверьте, освобождаете ли вы оперативную память, которая, как вы знаете, вам больше не понадобится.Вы не можете реально опубликовать всю программу целиком, поэтому я не могу предложить адресный совет, но в целом, если ваши итерации независимы друг от друга, вы должны освободить все ресурсы после завершения итерации и перед ее началом.И т.д.

2.Ваша память слишком фрагментирована, и нет места для большого объекта, который вы сейчас пытаетесь выделить.

Этот крепкий орешек, но, к счастью, он также менее вероятен из-за ваших проблем.Однако, если вы обнаружите, что ваша программа на самом деле не имеет утечек и не удерживает ресурсы дольше, чем это необходимо, вам придется попробовать атаковать и эту возможность.

Для этого вам нужно подуматьваши шаблоны распределения памяти, измените их, чтобы избежать фрагментации.Одной из возможностей будет выяснить, какие размеры объектов вы часто выделяете, и создать для них выделенные пулы памяти.Например, выделите достаточно большой буфер для ваших 48-байтовых объектов и сами выполняйте распределение / освобождение их в этом буфере.Чтобы на самом деле реализовать это, вы должны изучить параметры шаблона Allocator стандартных контейнеров, перегрузить (де) функции выделения operator new и operator delete и т. П.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...