Да, это может протечь. Например, использование cout
может вызвать исключение, и если это произойдет, ваш delete
никогда не будет вызван.
Вместо того, чтобы выделять динамический массив самостоятельно, вы можете рассмотреть возможность возврата std::vector
. Более того, превратите вашу функцию в правильный алгоритм, который берет итератор (в данном случае back_insert_iterator
) и записывает свои выходные данные.
Редактировать: Глядя на это более внимательно, я чувствую себя обязанным отметить, что мне действительно не нравится базовая структура этого кода. У вас есть одна функция, которая действительно выполняет две разные вещи. У вас также есть пара массивов, которые вы зависите от параллельной адресации. Я бы реструктурировал его в две отдельные функции: roll
и re_roll
. Я бы реструктурировал данные в виде массива структур:
struct die_roll {
int value;
bool keep;
die_roll() : value(0), keep(true) {}
};
Чтобы выполнить начальный бросок, вы передаете вектор (или массив, если вы действительно настаиваете) из них в функцию roll
, которая заполняет начальные значения. Чтобы выполнить переброс, вы передаете вектор в re-roll
, который перебрасывает, чтобы получить новое значение для любого die_roll, для которого keep
член был установлен в false
.