谁响应内存管理用malloc()

Who is in response for memory management with malloc()

也许这是个人喜好问题,假设您正在开发一些库并且其中有自定义数据类型:

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()负责内存分配。

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

可以不负责,看你的了。这是您在设计 API.

时必须做出的决定之一

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

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

My_custom_type foo;
init_my_custom_type(&foo);

最重要的是你始终如一。如果图书馆分配它,图书馆需要释放它。相反,如果客户端分配了它,则客户端需要释放它。这不仅更容易理解,还避免了当客户端和库不同意使用什么分配器时出现错误(在某些平台上动态链接时很容易意外发生)。

似乎两种变体都被使用了。但是,如果您打算使用第二个(即在库中分配内存),则值得为用户提供提供自己的分配器的选项,例如 set_allocators(malloc, free);