【发布时间】:2011-03-18 19:12:28
【问题描述】:
在 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 中隐藏mallocs,在_destroy 中隐藏frees。
优点:代码更短,因为无论如何都会调用函数。完全不透明的结构。
缺点:不能传递以不同方式分配的结构。
myStruct *s = myStruct_init();
myStruct_foo(s);
myStruct_destroy(foo);
我目前倾向于第一种情况;再说一次,我不知道 C API 设计。
【问题讨论】:
-
顺便说一句,我认为这将是一个很好的面试问题,比较和对比两种设计。
-
这里是 Armin Ronacher 关于如何使结构不透明但仍允许自定义分配的文章:lucumr.pocoo.org/2013/8/18/beautiful-native-libraries
标签: c api memory-management malloc