Память и мистер Структ - PullRequest
13 голосов
/ 20 ноября 2011

Если у меня есть структура:

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 массив отдельно?

Ответы [ 4 ]

10 голосов
/ 20 ноября 2011

Этого будет достаточно.
Вы не выделяли массив отдельно, поэтому достаточно просто освободить выделенный указатель.

Следуйте правилу:
Вам следует звонить free только по адресу, возвращенному вам по malloc, все остальное приведет к неопределенному поведению .

Ссылки:
c99 Стандарт: 7.20.3.2 Функция free

Синопсис
#include
void free (void * ptr);

Описание:
Функция free вызывает освобождение пространства, на которое указывает ptr, т.е. доступны для дальнейшего распределения. Если ptr является нулевым указателем, никаких действий не происходит. В противном случае, если аргумент не совпадает с указателем, ранее возвращенным calloc, malloc или realloc или, если пространство было освобождено при вызове free или realloc, поведение не определено .

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

4 голосов
/ 20 ноября 2011
Rec * prec = (Rec *) malloc(sizeof(Rec));

Спасибо, что включили распределение в комментарии (я отредактировал его в вопросе, надеюсь, я правильно понял).

Чтобы освободить память, выделенную с помощью malloc(3),вы используете free(3), как вы и предполагали.

Но учтите, что вам не нужно использовать (Rec *) кейс с malloc(3), если вы #include <stdlib.h>.Прототип функции, представленный в заголовке, позволяет компилятору выяснить, какие типы преобразований вам нужны.Включите заголовок и удалите приведение.

4 голосов
/ 20 ноября 2011

В своих более ранних ответах tekknolagi и Als оба верны.Если вы попытаетесь выполнить этот фрагмент кода, это может помочь осветить происходящее.

// 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 голосов
/ 20 ноября 2011

Вы используете free только тогда, когда используете malloc (или указатель NULL)

Значение, оно будет автоматически освобождено при выходе.


Если у вас есть malloc ред для этого, тогда этого будет достаточно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...