Освободить одноразовую переменную после ее возврата

#c #memory-management #scope #lifetime

#c #управление памятью #область применения #срок службы

Вопрос:

У меня есть функция, которая должна прослушивать входные данные на консоли Windows. Он использует conio.h. Он будет вызываться примерно 20 раз в секунду.

Как я могу предотвратить засорение моей памяти? Насколько я понимаю C, он будет каждый раз инициализировать новый символ. Я не могу использовать одну общую ячейку памяти. Функция должна быть полностью самоинкапсулированной.

Есть ли более простой способ удалить in его из памяти после его возврата, помимо того, что он также возвращает свой адрес в памяти и вызывает free(*adress) ?

Код:

 #include <conio.h>

// Passively listen for input, return char if input, else 0
char listen() {
    char in = 0;

    if (kbhit()) { // Some key was pressed
        in = getch(); // Which key?
    }

    return in;
}

void forward(void);

// Usage, for instance control a figure in a game
void main(void) {
    while (game) {
        char input = listen()

        if (input == 'w')
            forward();
    }
}
 

Комментарии:

1. Компиляторы умны, они не выделяют память при каждом вызове функции, они только повторно используют старую память (в данном случае стек). Поэтому не имеет значения, сколько раз вы вызываете функцию, если она сама явно не выделяет память, тогда ваше использование памяти должно быть фиксированным и статическим.

2. Проблем нет: char in это локальная переменная и как таковая будет сохранена в стеке и автоматически «освобождается» при возврате функции. Так что вам не нужно беспокоиться об этом.

3. Ваша память не будет «забита» приведенным выше кодом. Хранилище переменных в функции listen исчезнет, когда функция вернется. input Переменная в while цикле in main будет использоваться повторно каждый раз в цикле.

Ответ №1:

Есть ли более простой способ удалить in из памяти после его возврата

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

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

 char listen() {

    if (kbhit()) { // Some key was pressed
        return getch(); // Which key?
    }
   return 0;
}
 

Тем не менее, getch() возвращает an int , поэтому вам лучше изменить возвращаемый тип listen() функции, чтобы она также возвращала int значение.