Как free освобождает память, выделенную через malloc? - C (СИ)
Формулировка задачи:
Как функция free(void*) освобождает память выделенную malloc().
Если в malloc передавая размер malloc() знает сколько байт нужно выделить.
А в free() мы не передаем размер уничтожаемого блока, откуда free знает сколько байт нужно освободить?
Решение задачи: «Как free освобождает память, выделенную через malloc?»
textual
Листинг программы
void func(){
int* i = (int*)malloc(sizeof(int));
....
if(...) {
free(i); //Ну раз это Си то он себя не почистит
i = NULL; //Зачем так делать?
return;
}
....
free(i); //Ну раз это Си то он себя не почистит
i = NULL; //Зачем так делать?
}
Объяснение кода листинга программы
- В функции
funcвыделяется память под указательiна динамическом массиве размером в одинintс помощьюmalloc. - В коде не указано, но предположим, что в
iсохраняется какое-то значение. - Если условие в if-операторе не выполняется, то выполняется блок кода, который включает в себя:
- Вызов функции
freeс аргументомi, что приводит к освобождению памяти, выделенной подi. - Присваивание
iзначенияNULL, что можно интерпретировать как действие по очистке памяти.
- Вызов функции
- Если условие в if-операторе выполняется, то выполняется другой блок кода, который включает в себя:
- Дальнейшие действия функции, которые не включают в себя вызов функции
freeили присвоениеiзначенияNULL.
- Дальнейшие действия функции, которые не включают в себя вызов функции
- В конце функции, независимо от выполнения условия в if-операторе, выполняется:
- Вызов функции
freeс аргументомi, что приводит к освобождению памяти, выделенной подi. - Присваивание
iзначенияNULL, что можно интерпретировать как действие по очистке памяти. Таким образом, код выполняет следующие действия:
- Вызов функции
- Выделяет память под указатель
iна динамическом массиве размером в одинintс помощьюmalloc. - Если условие в if-операторе не выполняется, то:
- Освобождает память, выделенную под
i, с помощьюfree. - Присваивает
iзначениеNULL.
- Освобождает память, выделенную под
- Если условие в if-операторе выполняется, то:
- Продолжает выполнение функции без вызова
freeи присвоенияiзначенияNULL.
- Продолжает выполнение функции без вызова
- В конце функции, независимо от выполнения условия в if-операторе, выполняет:
- Освобождает память, выделенную под
i, с помощьюfree. - Присваивает
iзначениеNULL.
- Освобождает память, выделенную под