Освобождение структуры переменного размера в C - PullRequest
3 голосов
/ 28 июля 2010

Я использую C-структуру переменного размера, как показано ниже:

typedef struct {  
  int num_elems;  
  int elem1;  
} mystruct;  
// say I have 5 elements I would like to hold.  
mystruct * ms = malloc(sizeof(mystruct) + (5-1) * sizeof(int));  
ms->num_elems = 5;  
// ... assign 5 elems and use struct  
free(ms);

Это последнее free () освободит все, что было malloc'd, или только sizeof (mystruct)?

Ответы [ 2 ]

4 голосов
/ 28 июля 2010

Да. Это освободит весь блок, который был выделен с помощью malloc.

Если вы выделяете один блок памяти, используя malloc (как вы делаете в своем примере), то вам нужно вызвать free ровно один раз, чтобы освободить весь этот блок.

2 голосов
/ 28 июля 2010

При выполнении такого рода действий нужно быть осторожным, так как запись выделения, используемая free для определения того, какую память освобождать, создается malloc и связывается с адресом, возвращаемым malloc.

Это означает, что вы можете вызывать free для любого указателя, указывающего на первый байт блока malloc, и он освобождает правильный блок памяти, но если вы вызываете free для любого адреса в блоке, кроме первый байт, в лучшем случае вы будете SIGSEV или SIGBUS, а в худшем случае испортите таблицы распределения, что приведет к странному и необъяснимому поведению.

Так что, если у вас есть блоки, выделенные таким образом, как у mystruct, будьте осторожны, чтобы не смешивать их с однозначно распределенными mystructs, иначе вы столкнетесь с неприятным выбором между утечкой памяти и ее повреждением.

...