今天我试图调用strerror
POSIX函数。它返回一个char*
,现在我不确定是否要free
它free
它。
应用程序不得修改返回的字符串。
我认为返回指针应该是指向内部静态缓冲区的指针,在这种情况下,我永远不应该碰它。但是,它只是说"不要修改",根本不谈论内存所有权。我很困惑。我会假设"不接触"是"系统拥有,调用者借用",但我仍然没有信心,因为这只是我的推论,而不是承诺或定义。
我对C/POSIX编程不是很熟悉。我认为必须有一个完善的约定或明确的规则,但我找不到。
什么是 C/POSIX 函数的内存所有权规则?
约定是,除非返回指针的函数的描述告诉您应该释放指针,否则您不释放指针(或写入指针(。 不过,POSIX成语来表达这一点有点奇怪,所以很容易搞糊涂。
例如,对于strdup
和strndup
,它是:
返回的指针可以传递给
free()
。[...]在分配的新内存块中复制提供的malloc()
对于realpath
来说,它是这样的:
如果 resolved_name 是空指针,则生成的路径名应作为以 null 结尾的字符串存储在分配的缓冲区中,就像通过调用
malloc()
一样。
与此形成对比的是getaddrinfo
或fopen
的文档,后者不使用这种语言。 相反,您应该使用特定的释放函数(freeadrinfo
和fclose
(。
简而言之,每次 POSIX 说指针可以传递到free
或指向分配的内存的指针,就像使用malloc()
一样,这实际上意味着如果你想避免内存泄漏,你需要释放该指针。 否则,不允许释放指针。