Память и г-н Струт
Если у меня есть struct:
struct Rec
{
uint16_t vals[500];
};
Rec * prec = malloc(sizeof(Rec));
//Rec * prec = (Rec *) malloc(sizeof(Rec)); This code was my original and is incorrect.
// See Below for details.
// initialize everything in vals
Будет ли этот код достаточным для освобождения всей используемой памяти?
free(prec);
Или мне нужно free
массив отдельно?
Ответы
Ответ 1
Этого будет достаточно.
Вы не выделяли массив отдельно, поэтому достаточно освободить выделенный указатель.
Следуйте правилу:
Вы должны вызывать только free
по адресу, возвращенному вам malloc
, и все остальное приведет к Undefined Поведение.
Литература:
c99 Стандарт: 7.20.3.2 Функция free
Сводка
#include
void free (void * ptr);
Описание:
Функция free
вызывает освобождение пространства, на которое указывает ptr, то есть сделанное доступный для дальнейшего распределения. Если ptr является нулевым указателем, никаких действий не происходит. В противном случае, если аргумент не соответствует указателю, ранее возвращенному calloc
, malloc
, или realloc
, или если пространство было освобождено вызовом free
или realloc
, поведение не определено.
Возвращает
Функция free
не возвращает значение.
Ответ 2
Используйте free
только при использовании malloc
(или указателя NULL)
Значение, оно будет автоматически освобождено при выходе.
Если у вас есть malloc
ed для этого, тогда этого будет достаточно.
Ответ 3
В своих более ранних ответах теккнолаги и Альс оба правильны. Если вы попытаетесь выполнить этот фрагмент кода, это может помочь осветить происходящее.
// cc -o test test.c
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
struct rec {
uint16_t vals[500];
};
int main (int argc, char const *argv[])
{
printf("struct rec is %ld bytes.\n", sizeof(struct rec));
struct rec* rec_p = (struct rec*)malloc(sizeof(struct rec));
free(rec_p);
}
При выполнении этого кода вы увидите:
struct rec is 1000 bytes.
Вы вызывали malloc
только один раз. Этот вызов выделил все пространство, описанное в определении вашей структуры. Соответствующий free
также освобождает всю эту память.
Ответ 4
Rec * prec = (Rec *) malloc(sizeof(Rec));
Спасибо за включение выделения в комментарии (я отредактировал его в вопросе, надеюсь, что все правильно).
Чтобы освободить память, выделенную с помощью malloc(3)
, вы используете free(3)
, как вы догадались.
Но обратите внимание, что вам не нужно использовать случай (Rec *)
с malloc(3)
, если вы #include <stdlib.h>
. Прототип функции, представленный в заголовке, позволяет компилятору выяснить, что вы делаете. Включите заголовок и удалите бросок.