2010-12-28 2 views
0

Например:
Где я могу назвать функцию Free()?


В A.c:

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


В B.c:

Head treeHead; 
treeHead = init(); 


Должен ли я звонить бесплатно в методе инициализации() в A.c или в B.c?

+5

Вы должны позвонить бесплатно, когда закончите с памятью. – Falmarri

ответ

3

Я бы определить функцию в Ac:

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

Затем вызовите его в соответствующих местах в Bc:

freeHead(head); 
+1

'Head' уже является типом указателя, поэтому я не думаю, что вам нужен символ &, а правильный прототип -' void freeHead (Head head) '. –

+0

@Matthew Спасибо! –

0

free вызывается, когда вы больше не хотите или нуждаетесь в выделенной памяти, то есть когда вы закончите с TreeHead и TreeNode. Было бы глупо освобождать память в init(), потому что вы еще ничего не сделали с ней.

0

Здесь нет жесткого и быстрого правила, за исключением того, что вы можете вызвать free(), прежде чем init() вернется, потому что указатель возврата будет недействительным.

Это отличный пример того, как C++ намного лучше подходит для такого рода вещей. Если вам нужно использовать C, вы можете позвонить бесплатно() из любого места, в зависимости от того, что, по-видимому, имеет смысл.

0

Я бы на месте 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.

Смежные вопросы