在 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) 在_init
中隐藏malloc
,并在_destroy
中隐藏free
。
优点:代码更短,因为这些函数总是会被调用。结构体完全不透明。
缺点:无法传递以其他方式分配的结构体。
myStruct *s = myStruct_init();
myStruct_foo(s);
myStruct_destroy(foo);
目前我倾向于第一种情况;但是,我对C API设计不了解。