假设我有一个功能
int myfunction(char *s)
在此函数中,s
指向的字符串被操纵,return
值是错误代码。
假设传递的指针已经指向malloc()
内存。我是否有责任(开发一个库)在函数顶部释放这个内存,或者是因为不知道这个函数会调用malloc()
或者相关并设置{{}而是库用户的错误。 1}}指向那里?
答案 0 :(得分:2)
通常的合同是执行malloc
的人是free
的人。
同时考虑到指向的数据可能首先不是malloc
。可能在堆栈上
答案 1 :(得分:1)
如果您不打算修改字符串,则应将其声明为const
:
int myfunction(const char *s);
然后很明显myfunction()
不会假设所有权并尝试解除分配字符串(你不能用free()
指针调用const
)这是典型的方法。< / p>
由于被调用函数无法知道字符串是否是动态分配的,因此它无法承担所有权。
答案 2 :(得分:0)
好吧,如果我们看一下各种apis,那么我们就会有所了解。例如,strdup()
我们将const char *s
作为参数传递,strdup()
负责分配内存。另一方面,您还可以找到函数通常没有的示例
负责分配缓冲区,即fgets()
(还有更多)。还有一些功能允许两个getline()
作为示例。从手册页
getline()
:
If *lineptr is NULL, then getline() will allocate a buffer for storing the line
,which should be freed by the user program. (In this case, the value in *n is
ignored.)
Alternatively, before calling getline(), *lineptr can contain a pointer to a
malloc(3)-allocated buffer *n bytes in size.
所以,所有方法都是有效的。你必须要保持的一件事是 文档。如果应该正确实现它(不要忘记考虑各种后果)并让用户知道该特定功能的作用。如果您不提供文档并且用户有责任了解特定功能的工作原理,那么这是您的错。