Перейти к содержимому

Как работает free в си

  • автор:

void free(void *ptr)

Функция free() возвращает память, на которую указывает параметр ptr, назад в кучу. В резуль­тате эта память может выделяться снова.

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

Следующая программа сначала выделяет место для строк , вводимых пользователем , а затем осво­бождает память :
#include
#include
int main ( void )
{
char * str [ 100 ] ;
int i ;
for ( i = 0 ; i < 100 ; i ++ )
{
if ( ( str [ i ] = ( char * ) malloc ( 128 ) ) == NULL ) {
printf ( «Allocation error.» ) ;
exit ( 0 ) ;
}
gets ( str [ i ] ) ;
}

/* освобождение памяти */
for ( i = 0 ; i < 100 ; i ++ ) free ( str [ i ] ) ;
return 0 ;
}

Как работает free

Как работает Free Pascal в Windows 7
у меня стоит vista ,хочу поставить window 7 как в window 7 будет работать free pascal может.

Как во free pascal узнать, в какой ос работает программа: Win 7 или Win xp?
Так же хотелось бы узнать имя пользователя, запустившего программу.

«Free Pascal» Как это работает?
Я новичок в этом деле и не знаю даже з чего начать.

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

Эксперт C

27695 / 17314 / 3809
Регистрация: 24.12.2010
Сообщений: 38,979
OpXiv, почему бы не написать просто

free( var);

124 / 62 / 17
Регистрация: 05.02.2013
Сообщений: 255

ЦитатаСообщение от OpXiv Посмотреть сообщение

Суть в том что, free берёт SizeOf(*ptr) ?

Функции free() кроме указателя на выделенную область ничего не нужно.
Поэтому исходите из правила — сколько указателей, столько раз освобождаете память. Тип указателей, точнее к-во выделенных байт, функции malloc()/free знают сами.
В вашем случае я бы сделал так

1 2 3 4 5 6
typedef struct { NameStruct1 Orig; void *AddProp; } NameStruct2; NameStruct2 *var = (NameStruct2*)malloc(sizeof(NameStruct2));

Если вы уверены, что структура Orig полностью статическая (то есть внутри структуры все поля статические), то осталось выделить память под var->AddProp итого 2 указателя.
Соответственно free(var->AddProp) и free(var) .

87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Не работает ассемблер в Free Pascal
Free Pascal при компиляции кода, содержащего вставки на ассемблере, выдает ошибки Uncnown.

Free Pascal работает некорректно
Что за чертовщина? Free Pascal отказывается читать мои команды и творит неведомую хрень. Вот 2.

Программа не работает на Free Pascal
Программа на Free Pascal сразу закрывается, хотя на ABC все нормально работает. Помогите.

msxml4 — не работает Free-threaded model
HRESULT hr; MSXML2::IXMLDOMDocument2 * pStyleSheet=NULL;.

Free Pascal плохо работает в Windows 7
Здравствуйте! У меня стойт windows 7. Я установил Free Pascal, но он плохо на ней работает.

Почему не работает модуль graph в Free Pascal
во FreePascal’е не знаю почему не работает этот модуль, в папке units есть graph, у друга работает.

Функция free

Функция free освобождает место в памяти. Блок памяти, ранее выделенный с помощью вызова malloc , calloc или realloc освобождается. То есть освобожденная память может дальше использоваться программами или ОС.

Обратите внимание, что эта функция оставляет значение ptr неизменным, следовательно, он по-прежнему указывает на тот же блок памяти, а не на нулевой указатель.

Параметры:

  • ptrmem
    Указатель на блок памяти, ранее выделенный функциями malloc , calloc или realloc , которую необходимо высвободить. Если в качестве аргумента передается нулевой указатель, никаких действий не происходит.

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

Функция не имеет возвращаемое значение.

Пример: исходный код программы

//пример использования функции free #include #include int main() < int * buffer1 = (int*) malloc(100 * sizeof(int)), // выделяем память под 100 элементов массива типа int, с предварительной инициализацией * buffer2 = (int*) calloc(100, sizeof(int)), // выделяем память под 100 элементов массива типа int, без инициализации * buffer3 = (int*) realloc(buffer2, 500 * sizeof(int)); // перераспределить память в блоке buffer2, новый размер блока - 500 элементов free(buffer1); // высвобождаем блок памяти buffer1 free(buffer3); // высвобождаем блок памяти buffer2, его новый адрес, после перераспределения, хранится в buffer3 return 0; >

Пример работы программы

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

Откуда функция free знает, сколько конкретно байтов памяти освобождать [дубликат]

Я новичок в программировании на языке Си. Вопрос по поводу работы функции free стандартной библиотеки stdlib.h . Допустим, я выделил память для 100 символов:

char *pointer = malloc(100 * sizeof(char)); 

А как грамотно освободить эту память? Необходимо освобождать каждый char

for (int i = 0; i < 100; i++) free(pointer[i]); 

или достаточно

free(pointer); 

одним вызовом функции free ? Я склоняюсь ко второму варианту, поскольку значение pointer[i] из первого варианта не является указателем. Но откуда функция free знает, сколько памяти я выделил через malloc ? Это где-то записано в оперативной памяти или здесь используется какая-то хитрость?

Отслеживать
218k 15 15 золотых знаков 117 117 серебряных знаков 229 229 бронзовых знаков
задан 3 янв 2019 в 12:34
2,510 5 5 золотых знаков 29 29 серебряных знаков 59 59 бронзовых знаков

Я читал с приведением тестов и скринов, что malloc возвращает адрес. И если от этого адреса отнять 16 байт, прочитать int, то это и будет размер выделенного блока. russianblogs.com/article/6889100669

24 окт в 21:03

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

free(pointer); 

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

Например, как вариант - вы запрашиваете malloc , при этом выделяется памяти чуть больше - ну, на какие-то, скажем, 4-8 байт, и вам возвращается указатель, смещенный на эти 4-8 байт, в которые менеджер записывает длину (и не только - если памяти выделить побольше:)). А при освобождении - он отсчитывает от переданного указателя нужное число байт и читает сохраненную информацию.

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

Отслеживать
ответ дан 3 янв 2019 в 12:36
218k 15 15 золотых знаков 117 117 серебряных знаков 229 229 бронзовых знаков

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

В glibc есть интерфейс для доступа к этой информации: size_t malloc_usable_size(void*) . Ну и вообще там много интересного: https://www.gnu.org/software/libc/manual/html_node/Summary-of-Malloc.html#Summary-of-Malloc

Отслеживать
ответ дан 3 янв 2019 в 12:38
flapenguin flapenguin
1,584 7 7 серебряных знаков 12 12 бронзовых знаков

Процесс освобождения памяти должно "зеркально" соответствовать процессу его выделения. В данном случае вы выделяли память одним вызовом malloc . Значит освобождать вы ее будете одним вызовом free . Ни о каком "освобождать каждый char" не может быть и речи.

В традиционной реализации, malloc выделит больше памяти, чем вы запросили. В дополнительные байты памяти (обычно в начале выделенного блока) будет записан размер выделенного блока памяти

+-----+-------------------------- ----+ | 100 | . | +-----+-------------------------- ----+ ^ ^ ^ | | адрес, который `malloc` вернет вам в качестве результата | | | размер блока, записанный туда `malloc` | начало фактически выделенного `malloc` блока 

Когда вы вызовете free(pointer) , функция free просто прочтает размер блока из области памяти "слева" от адреса pointer - так она узнает, сколько памяти нужно освободить. Вот и вся "хитрость".

Записанный размер может быть полным размером блока или полезным размером блока, а также может меняться в большую сторону из соображений выравнивания размеров блоков. Это все детали реализации, как, впрочем, и весь механизм.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *