2010-12-28 11 views
0

Zum Beispiel:
Wo soll ich die Free() Funktion aufrufen?


In A. C:

Head init(){ 
Head treeHead; 
treeHead = malloc(sizeof (struct TreeHead)); 
treeHead->Root = malloc(sizeof (struct TreeNode)); 
return treeHead;} 


In B.c:

Head treeHead; 
treeHead = init(); 


Soll ich in init kostenlos anrufen() -Methode in A. C oder in B.c?

+5

Sie sollten kostenlos anrufen, wenn Sie mit dem Speicher fertig sind – Falmarri

Antwort

3

I eine Funktion in Ac definieren würde:

void freeHead(Head head){ 
    free(head->Root); 
    free(head); 
    return; 
} 

dann in Bc in entsprechenden Stellen nennen:

freeHead(head); 
+1

'Head' ist bereits ein Zeigertyp, also glaube ich nicht, dass Sie die & benötigen, und der richtige Prototyp ist' void freeHead (Head head) '. –

+0

@Matthew Danke! –

0

free wird aufgerufen, wenn Sie den zugewiesenen Speicher nicht mehr benötigen oder benötigen, d. H. Wenn Sie mit TreeHead und TreeNode fertig sind. Es wäre albern, den Speicher in init() freizugeben, weil du damit noch nichts gemacht hast.

0

Es gibt hier keine feste Regel, außer dass Sie free() vor init() zurückgeben können, weil dann der Rückgabezeiger ungültig ist.

Dies ist ein großartiges Beispiel dafür, wie C++ so viel besser für diese Art von Sache ist. Wenn Sie C verwenden müssen, können Sie free() von jedem Ort aus aufrufen, je nachdem, was den besten Sinn ergibt.

0

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.

Verwandte Themen