Он не имеет никакого отношения к выделению памяти как таковой.
Проблема в этих строках
int zerosneeded = length - tmp.size();
while (zerosneeded != 0) {
tmp.push_back(0);
zerosneeded--;
}
не зная, почему он делает то, что делает, у меня возникает вопрос при взгляде на код: «Может ли zerosneeded
быть меньше нуля?». Тем более что zerosneeded
определяется как int
вместо unsigned int
(применимо к остальной части кода).
Если значение нуля меньше нуля, бесконечный цикл будет распределяться до исчерпания. Быстрая проверка подтверждает это:
int zerosneeded = length - tmp.size();
if(zerosneeded < 0)
{
std::cout << "fatal, zerosneeded < 0 \n";
throw std::runtime_exception("fatal, zerosneeded < 0");
}
Надеюсь, это поможет в вашей отладке.
Редактировать
Относительно того, почему нулевые значения отрицательны:
во-первых, рассчитывается количество возможностей, которое составляет символы ^ длина.
int possibilities = std::pow(symbols, length);
при отправке значений в tmp мы в основном находим первый x такой, что длина ^ x> частное. Частное находится в диапазоне [0, символы ^ длина] и используется push-значениями в tmp.
int quotient = i;
while (quotient!=0) {
tmp.push_back(quotient % length);
quotient = quotient / length;
}
Если символы ^ длина> длина ^ длина, первый x такой, что длина ^ x> частное, дает x> длину, в результате чего int zerosneeded = length - tmp.size();
становится отрицательным.
Для примера у нас длина = 4, символы = 6, поэтому коэффициенты имеют диапазон [0,6 ^ 4] = [0, 1296]. Но уже для 256 мы имеем 4 ^ 4 = 256 => 4 ^ 5> 256, поэтому наш x = 5 => zerosneeded = 4 - 5 = -1.
Это ничего особенного для длины = 4 и символов = 6, и на самом деле должно происходить до тех пор, пока длина <символов. </p>