假设我有一个函数
int myfunction(char *s)
在这个函数中,s
指向的字符串被操作,而return
的值是一个错误代码。
假设传递的指针已经指向malloc()
内存。是我的责任(开发库)释放函数顶部的内存,还是库用户的错,因为他们不知道这个函数将调用malloc()
或相关函数,并将s
设置为指向那里?
通常的合同是执行malloc
的人就是执行free
的人。
还要考虑的是,所指向的数据可能一开始就没有经过malloc
’编辑。可能在堆栈上
如果您不打算修改字符串,则应将其声明为const
:
int myfunction(const char *s);
然后很明显,myfunction()
不会承担所有权,并尝试解除分配字符串(不能用const
指针调用free()
),这是典型的方法。
由于被调用的函数不知道字符串是否是动态分配的,因此它承担所有权是没有意义的。
好吧,如果我们看看各种api,我们就会有一个想法。例如,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.
因此,所有的方法都是有效的。你必须坚持的一件事是文档。如果应该正确地实现它(不要忘记考虑各种后果),并让它的用户知道该特定函数的作用。如果你没有提供文档,那是你的错,用户有责任知道这个特定功能是如何工作的。