Я бы на месте free()
вызов в модуле, который сделал соответствующий malloc()
/calloc()
звонок. В вашем случае «A.c» предоставил функцию для выделения памяти для объекта Head
. Должна быть соответствующая функция для удаления ранее выделенной памяти в «A.c».
Мне не имеет смысла освобождать память, полученную от нестандартных библиотек (т. Е. Стороннего кода), когда я являюсь потребителем этой библиотеки. Для этого объекта может быть другая память, к которой я не обязательно имею доступ, особенно для opaque data types.
например,
MyType.c:
typedef struct _MyType
{
char *name; /* fields are "private" */
...
} *MyType; /* opaque type "MyType" */
MyType MyType_create(void)
{
MyType ret = malloc(sizeof *ret);
ret->name = malloc(...);
return ret;
}
void MyType_delete(MyType obj)
{
free(obj->name);
free(obj);
}
program.c:
typedef void *MyType;
int main(void)
{
MyType obj1 = MyType_create(); /* we have an "instance" of MyType */
MyType_delete(obj1); /* delete it */
MyType obj2 = MyType_create(); /* we have an "instance" of MyType */
free(obj2); /* uh oh, what happened to the memory allocated for obj2->name? leak */
}
Смотрите также другое example.
Вы должны позвонить бесплатно, когда закончите с памятью. – Falmarri