Статическая динамическая память автоматически освобождается в конце программы? - PullRequest
1 голос
/ 15 марта 2019

Ключевое слово static поддерживает указатель живым до тех пор, пока программа не завершится, но выделяется ли память для указателя buffer free'd автоматически после завершения процесса?или программист должен это делать?


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


Функция :

char *readStdin(void) {
    static char *buffer = NULL;
    ssize_t ret;

    if (buffer != NULL) {
        // DO SOMETHING WITH PREVIOUSLY READ BYTES
    }
    /* Allocate and NULL-terminate a Buffer */
    buffer = malloc(BUFSIZ);
    if (buffer == NULL)
        return (NULL);
    buffer[BUFSIZ] = '\0';

    /* Read from Standard Input at most 'BUFSIZ' characters*/
    ret = read(0, buffer, BUFSIZ);

    /* Free Buffer if no Input Read */
    if (ret <= 0) {
        free(buffer);
        buffer = NULL;
    }

    /* Return the read Input */
    return (buffer);
}

Программа :

int main(void) {
    /* Print the Read Bytes */
    printf("%s", readStdin());
    printf("%s", readStdin());
    printf("%s", readStdin());
    ...
}

1 Ответ

3 голосов
/ 15 марта 2019

выделяется ли память для буфера указателя free'd автоматически при завершении процесса?

Это зависит. На большинстве современных десктопов и серверов да. В некоторых старых системах или некоторых современных чудаков не обязательно. Лучше всего всегда убирать за собой независимо от того, что делает ОС при выходе из программы.

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

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

...