Функции библиотеки C -free()

Стандартная библиотека C - <stdlib.h>

Описание

В языке C,free()Функция является стандартной библиотечной функцией, используемой для освобождения памяти, выделеннойmalloc(), calloc(), realloc()память, выделенная функциями динамического выделения, такими как. Когда динамически выделенная память больше не нужна, вызовfree()функция позволяет избежать утечек памяти и обеспечить эффективное управление памятью программой.

Объявление

Ниже приведено объявление функции free().

void free(void *ptr)

Параметр

  • ptr-- Указатель указывает на блок памяти, который нужно освободить; ранее он был выделен вызовом malloc, calloc или realloc. Если переданный аргумент — нулевой указатель, никаких действий не выполняется.

Возвращаемое значение

Эта функция не возвращает никакого значения.

Пример

В следующем примере демонстрируется использование функции free().

Пример

#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char *str; /*Начальное выделение памяти*/ str = (char *) malloc(15); strcpy(str, "example"); printf("String = %s, Address = %p\n", str, str); /*Перераспределение памяти*/ str = (char *) realloc(str, 25); strcat(str, ".com"); printf("String = %s, Address = %p\n", str, str); /*Освобождение выделенной памяти*/ free(str); return(0); }

Давайте скомпилируем и запустим приведённую выше программу, которая выдаст следующий результат:

String = example,  Address = 0x7fe4e4c02b10
String = example.com,  Address = 0x7fe4e4c02b10

Примечания

  • Освобождение корректной памяти: Можно освобождать только память, выделенную с помощью функций динамического выделения памяти; память, выделенную другими способами (например, локальные переменные или глобальные переменные), освобождать нельзя.

  • Предотвращение двойного освобождения: Один и тот же блок памяти нельзя освобождать несколько раз; иначе может возникнуть неопределённое поведение.

  • Обработка указателей после освобождения: После освобождения памяти указатель по-прежнему указывает на освобождённую область памяти. Чтобы избежать появления висячего указателя, можно присвоить указателю значениеNULL。

    free(array);
    array = NULL;
  • Проверка указателя на NULL: вызовитеfree()Перед [освобождением] лучше всего проверить, является ли указатель NULL, чтобы обеспечить стабильность программы.

    if (array != NULL) {
        free(array);
        array = NULL;
    }

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


Утечки памяти и висячие указатели

  • Утечка памяти: Если динамически выделенная память не освобождается или ссылка на неё теряется, память больше не может использоваться программой, что приводит к утечке памяти.
  • Висячий указатель: Указатель, который указывает на освобождённую память, называется висячим указателем. Если к висячему указателю снова обратиться, это приводит к неопределённому поведению, что может вызвать сбои программы или повреждение данных.

В C после вызова free() для освобождения динамически выделенной памяти указатель по-прежнему хранит ранее выделенный адрес, что приводит к висячему указателю. Висячий указатель — это указатель, который указывает на освобождённую память. Разыменование его приводит к неопределённому поведению.

Чтобы избежать проблемы висячего указателя, обычно после вызова free() указателю присваивают NULL. Это гарантирует, что программа не будет ошибочно использовать освобождённую память.

Пример

#include <stdio.h>
#include <stdlib.h>

int main() {
    // динамическое выделение памяти
    char *str = (char *)malloc(100 * sizeof(char));
    if (str == NULL) {
        printf("Не удалось выделить память\n");
        return 1;
    }

    // Использовать выделенную память
    snprintf(str, 100, "Hello, World!");
    printf("%s\n", str);

    // Освобождение динамически выделенной памяти
    free(str);
   
    // установите указатель в NULL, чтобы избежать висячего указателя
    str = NULL;

    // теперь str равен NULL, безопасно избегая проблемы висячего указателя
    if (str == NULL) {
        printf("str is NULL\n");
    }

    return 0;
}

В этом примере указатель str устанавливается в NULL после вызова free(), тем самым избегая проблемы висячего указателя. Если вы попытаетесь снова использовать этот указатель, поскольку он равен NULL, вы можете избежать неопределённого поведения с помощью условной проверки.

Стандартная библиотека C - <stdlib.h>

Другие расширения