Вы никогда не должны освобождать файл - fclose обрабатывает освобождение ресурсов должным образом. Как правило, только бесплатные указатели, которые были выделены непосредственно malloc. Большинство других указателей будут иметь свои собственные функции очистки ресурсов.
Это, как говорится, относительно вашего первоначального вопроса:
Я считаю, что предоставление функции деструктора обычно является лучшей практикой по трем причинам.
1) Во многих случаях бесплатное использование неуместно, и это может быть неочевидно для вашего конечного пользователя. ФАЙЛ * хороший пример этого - вам не следует звонить free(f);
выше ...
2) Если вы используете это в DLL, в зависимости от времени выполнения, инкапсулируя свободную функциональность, можно обойти многие, многие тонкие ошибки из-за смешивания времени выполнения, особенно на платформе Windows. Попытка использовать DLL, скомпилированную в VS2005 из VS2008, может вызвать проблемы, если вам случится освободить память в коде одной платформы, который был выделен в другой. Наличие функции-обертки для управления памятью решает эту важную проблему.
3) Многие функции API C работают таким образом - например, FILE * с использованием fopen / fclose. Это не удивительно для пользователя вашей библиотеки.