2014-11-16 4 views
4

Предположим, у меня есть следующая программа:fclose() затем free()?

#include <stdio.h> 

int main() { 
    FILE * pFile; 
    pFile = fopen ("myfile.txt","r"); 

    fclose (pFile); 
    //This never happens: free(pFile) 
    return 0; 
} 

Я никогда не видел программу, которая делает free(pFile) после закрытия дескриптора файла. Почему это?

Я знаю, что с fclose() не получает указатель на pFile, то это фактически не освобождает память указателя. У меня создалось впечатление, что указатели всегда должны освобождать свою память, если они указывают на динамически выделенную память. Почему никто не free() указатель файла?

+0

«Почему никто не' free() 'указатель файла?" - потому что это было бы неправильно. –

+0

'free()' также не получает указатель на свой аргумент. –

+0

во-первых, вы НЕ хотите, чтобы вы звонили бесплатно в таблицу дескриптора файла (где точки FILE * относятся к некоторой записи в этой таблице), во-вторых, вы вызываете только free() только указатель, который был установлен одним из malloc () семейство функций (некоторые функции, такие как dup(), используют malloc в фоновом режиме, поэтому полученный указатель должен быть свободен) – user3629249

ответ

10

free вызывается в ответ на malloc для возврата выделенной памяти. fopen скорее всего действительно делает некоторые mallocing, но акт закрытия ручки (fclose), по дизайну, собирается очистить все fopen сделал. Контракт, который у вас есть с fopen, заключается в том, что закрытие дескриптора освободит все выдающиеся ресурсы.

Общее правило для каждого alloc имеет free. Если вы вызываете функцию, которая выполняет alloc, это описание должно предупредить вас о том, что вызывающий абонент несет ответственность за освобождение.

Short story, fclose очистит любые ресурсы, созданные fopen.

+0

Awesome! Спасибо, я никогда не нашел для вас окончательного ответа! –

2

Назначение памяти функции fopen зависит от реализации (на ЭЛТ). Вы можете быть уверены, что fclose всегда используется для освобождения всей памяти, выделенной fopen.

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