Каков правильный/предпочтительный способ выделения памяти в C API?
Сначала я вижу два варианта:
1) Позвольте вызывающей программе выполнять всю (внешнюю) обработку памяти:
myStruct *s = malloc(sizeof(s));
myStruct_init(s);
myStruct_foo(s);
myStruct_destroy(s);
free(s);
Функции _init
и _destroy
необходимы, поскольку внутри нее может быть выделено больше памяти, и ее нужно где-то обрабатывать.
Это имеет недостаток в том, что он длиннее, но в некоторых случаях также можно исключить malloc (например, ему может быть передана структура, распределенная по стекам:
int bar() {
myStruct s;
myStruct_init(&s);
myStruct_foo(&s);
myStruct_destroy(&s);
}
Кроме того, необходимо, чтобы вызывающий пользователь знал размер структуры.
2) Скройте malloc
в _init
и free
в _destroy
.
Преимущества: более короткий код, поскольку функции все равно будут вызваны. Полностью непрозрачные структуры.
Недостатки: нельзя передать структуру, выделенную другим способом.
myStruct *s = myStruct_init();
myStruct_foo(s);
myStruct_destroy(foo);
Я сейчас склоняюсь к первому случаю; опять же, я не знаю о дизайне C API.