I den free()
Anruf im Modul plazieren würde, die die entsprechende taten malloc()
/calloc()
Anruf. In Ihrem Fall stellte "A.c" eine Funktion bereit, um Speicher für ein Objekt Head
zuzuweisen. Es sollte eine entsprechende Funktion geben, um den Speicher zu löschen, der zuvor auch in "A.c" zugewiesen wurde.
Es macht für mich keinen Sinn, den Speicher freizugeben, den ich von Nicht-Standard-Bibliotheken (d. H. Code von Drittanbietern) erhalten habe, wenn ich der Konsument dieser Bibliothek bin. Möglicherweise ist diesem Objekt ein anderer Speicher zugewiesen, auf den ich nicht unbedingt zugreifen kann, insbesondere für opaque data types.
z.B.
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);
}
programm.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 */
}
Siehe auch andere example.
Sie sollten kostenlos anrufen, wenn Sie mit dem Speicher fertig sind – Falmarri