Ниже приведен ответ для C, опубликованный до того, как OP признался в использовании C ++. На этом языке используйте RAII и умные указатели, как рекомендовано другими.
Если функциявозвращает выделенную память, затем вызывающий отвечает за освобождение, и это должно быть указано в документации функции.
Если требуется дополнительная очистка, то предлагается free
, или такая очистка может потребоваться в будущих версиях библиотеки, тогда вы должны предложить функцию очистки (как stdio
делает с fclose
) что делает освобождение.Если вы не можете предсказать, может ли понадобиться дополнительная очистка в будущем, будет хорошей идеей предположить, что это произойдет в какой-то момент.Упаковка free
дешева.
Думайте об этом как о форме симметрии: если клиент получает ресурс (объект) из библиотеки, то в конечном итоге он отвечает за передачу его обратно в библиотеку для утилизации:
void use_the_foo_library()
{
Foo *f = make_foo();
if (f == NULL)
ERROR();
foo_do_bar(f);
foo_do_baz(f);
foo_destroy(f);
}
, где в foolib 1.0, foo_destroy
- это просто
void foo_destroy(Foo *p)
{
free(p);
}
, но в версии 2.0 оно может увеличиться до
void foo_destroy(Foo *p)
{
fclose(p->logfile);
free(p);
}
и т. Д.Этот стиль соответствует шаблону непрозрачный указатель .Это также дает вам свободу замены malloc
и free
в любой точке специальным распределителем памяти, таким как распределитель пула , без необходимости изменения любого клиентского кода.