Если передавать вектор по значению - возвращает цифры, а по указателю возвращает правильный ответ. Объясните почему?

108
28 декабря 2021, 10:30

По значению дает набор цифр :

int recursiveMinimum(vector<int>array)
{
static int min = INT_MAX, count = 0;
if (count < array.size())
{
    if (array[count] <= min)
        min = array[count];
    count++;
    recursiveMinimum(array);
}
else
    return min;
} 

По указателю дает правильный ответ:

int recursiveMinimum(vector<int>&array)
{
    static int min = INT_MAX, count = 0;
    if (count < array.size())
    {
        if (array[count] <= min)
            min = array[count];
        count++;
        recursiveMinimum(array);
    }
    else
        return min;
} 
Answer 1

У вас отсутствует return в первой ветке if. Ваша функция ничего не возвращает ни из одного уровня рекурсии, кроме самого нижнего. Поведение не определено в обоих вариантах, т.е. ваше возвращенное на самый верх значение - это просто мусор.

А то, что этот мусор случайно совпадает с правильным ответом во втором варианте - известный феномен, заключающийся в том, что при отсутствующем return иногда получается так, что из наивно странслированного кода (без оптимизаций и т.п.) "как бы возвращается" последнее вычисленное значение (например, регистр eax для значения типа int на платформе x86), если оно не будет затерто другим кодом при выходе из функции.

При передаче по значению при выходе из функции будет вызываться деструктор array, который с большой долей вероятности затрет содержимое eax, в результате чего из функции будет "возвращен" совсем посторонний мусор. При передаче по ссылке при выходе из функции ничего не делается и последнее значение eax сохраняется в нетронутом виде. Из-за этого создается иллюзия того, что второй вариант "работает правильно".

Разумеется, любой чих в организации кода или в настройках компилятора будет убивать эту случайную "работоспособность" вашего второго варианта.

READ ALSO
Управление спящим режимом пк

Управление спящим режимом пк

Необходимо реализовать управление спящим режимом пк на c++, у меня вообще нет идей как это реализовать(я только начал изучение с++)

132
C++, инициализация атомарных объектов

C++, инициализация атомарных объектов

У меня есть вопрос, касающийся инициализации атомарных объектов

188
C++, деструктор std::future

C++, деструктор std::future

Рассмотрим следующий код:

158