谁响应malloc()进行内存管理

ghost28147

也许是口味问题,但假设您正在开发一些库,并且其中包含自定义数据类型:

struct My_custom_type { ... }; 

所以问题是:为这种数据类型分配内存并在客户端代码中初始化它会更合适吗?

My_custom_type *foo;
foo = malloc( sizeof( My_custom_type ) );
init_my_custom_type( foo );

相对

My_custom_type *foo = init_my_custom_type();

在最后一个示例init_my_custom_type()中负责内存分配。

换句话说,谁在响应(通常)进行内存分配,库开发人员或使用该库的客户端?

用户395760

可以负责任,这取决于您。这是设计API时必须做出的决定之一。

在库中进行分配对于客户端来说稍微方便些,但效率可能会降低。它总是需要堆分配,并且除非使API更复杂以使客户端覆盖分配函数(例如,通过接受函数指针),否则它还与许多较大或受资源限制的项目使用的自定义分配器交互不良。此外,何时解除分配仍然是客户端的责任(只有他们知道何时完成),这只是通过调用库的函数而不是直接与分配器对话来实现。

使用客户端提供的内存不太方便,并且更容易出错(例如,在更多的地方分配了错误的内存量),但是效率更高。客户端可以在堆栈上分配内存,并将其传递给init_*

My_custom_type foo;
init_my_custom_type(&foo);

最重要的是你要保持一致如果库分配了它,则库需要释放它。相反,如果客户端分配它,则客户端需要释放它。这不仅易于理解,而且还避免了客户端和库在使用哪种分配器时存在分歧(在某些平台上动态链接时很容易意外地做到这一点)时出错。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章