今天我想调用 strerror
POSIX 函数。它返回一个 char*
,现在我不确定是否要 free
它或不 free
它。
The application shall not modify the string returned.
我认为返回指针应该是指向内部静态缓冲区的指针,在那种情况下,我永远不应该碰它。但是,它只是说“不要修改”,根本不谈论内存所有权。我很困惑。我会将“无接触”假设为“系统拥有,调用者借用”,但我仍然没有信心,因为这只是我的推断,而不是 promise 或定义。
我对 C/POSIX 编程不是很熟悉。我认为这必须有一个完善的约定或明确的规则,但我找不到。
C/POSIX 函数的内存所有权规则是什么?
最佳答案
惯例是您不释放指针(或写入指针)除非返回它的函数的描述告诉您应该释放它。但是,表达 that 的 POSIX 习语有点奇怪,所以很容易混淆。
例如,对于 strdup
and strndup
它是:
The returned pointer can be passed to
free()
. […] duplicating the provided s in a new block of memory allocated as if by usingmalloc()
对于 realpath
,是这样的:
If resolved_name is a null pointer, the generated pathname shall be stored as a null-terminated string in a buffer allocated as if by a call to
malloc()
.
将此与 getaddrinfo
的文档进行对比或 fopen
,它不使用这种语言。相反,您应该使用特定的释放函数(freeadrinfo
和 fclose
)。
简而言之,每次 POSIX 表示可以将指针传递给 free
或指向分配的内存的指针,就好像使用 malloc( )
,这实际上意味着如果你想避免内存泄漏,你需要释放那个指针。否则,不允许释放指针。
关于c - 从 POSIX 函数返回指针的一般内存所有权规则是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52574866/