Если вы получаете std::bad_alloc
, это может означать одно из двух:
1.Вам не хватает памяти
Это может быть легко вызвано утечкой памяти;то есть, динамически выделяя память, а затем теряя последний указатель на нее, так что она не может быть освобождена.Вы должны проверить свою программу на это, используя такой инструмент, как valgrind.
Если у вас нет утечки памяти, проверьте, освобождаете ли вы оперативную память, которая, как вы знаете, вам больше не понадобится.Вы не можете реально опубликовать всю программу целиком, поэтому я не могу предложить адресный совет, но в целом, если ваши итерации независимы друг от друга, вы должны освободить все ресурсы после завершения итерации и перед ее началом.И т.д.
2.Ваша память слишком фрагментирована, и нет места для большого объекта, который вы сейчас пытаетесь выделить.
Этот крепкий орешек, но, к счастью, он также менее вероятен из-за ваших проблем.Однако, если вы обнаружите, что ваша программа на самом деле не имеет утечек и не удерживает ресурсы дольше, чем это необходимо, вам придется попробовать атаковать и эту возможность.
Для этого вам нужно подуматьваши шаблоны распределения памяти, измените их, чтобы избежать фрагментации.Одной из возможностей будет выяснить, какие размеры объектов вы часто выделяете, и создать для них выделенные пулы памяти.Например, выделите достаточно большой буфер для ваших 48-байтовых объектов и сами выполняйте распределение / освобождение их в этом буфере.Чтобы на самом деле реализовать это, вы должны изучить параметры шаблона Allocator
стандартных контейнеров, перегрузить (де) функции выделения operator new
и operator delete
и т. П.