c语言 - 从 POSIX 函数返回指针的一般内存所有权规则是什么?



今天我试图调用strerrorPOSIX函数。它返回一个char*,现在我不确定是否要freefree它。

应用程序不得修改返回的字符串。

我认为返回指针应该是指向内部静态缓冲区的指针,在这种情况下,我永远不应该碰它。但是,它只是说"不要修改",根本不谈论内存所有权。我很困惑。我会假设"不接触"是"系统拥有,调用者借用",但我仍然没有信心,因为这只是我的推论,而不是承诺或定义。

我对C/POSIX编程不是很熟悉。我认为必须有一个完善的约定或明确的规则,但我找不到。

什么是 C/POSIX 函数的内存所有权规则?

约定是,除非返回指针的函数的描述告诉您应该释放指针,否则您不释放指针(或写入指针(。 不过,POSIX成语来表达这一点有点奇怪,所以很容易搞糊涂。

例如,对于strdupstrndup,它是:

返回的指针可以传递给free()。[...]在分配的新内存块中复制提供的malloc()

对于realpath来说,它是这样的:

如果 resolved_name 是空指针,则生成的路径名应作为以 null 结尾的字符串存储在分配的缓冲区中,就像通过调用malloc()一样。

与此形成对比的是getaddrinfofopen的文档,后者不使用这种语言。 相反,您应该使用特定的释放函数(freeadrinfofclose(。

简而言之,每次 POSIX 说指针可以传递到free或指向分配的内存的指针,就像使用malloc()一样,这实际上意味着如果你想避免内存泄漏,你需要释放该指针。 否则,不允许释放指针。

最新更新