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

标签 c posix free resource-management

今天我想调用 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 using malloc()

对于 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 ,它不使用这种语言。相反,您应该使用特定的释放函数(freeadrinfofclose)。

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

关于c - 从 POSIX 函数返回指针的一般内存所有权规则是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52574866/

相关文章:

检查用户输入长度(C 编程)

c++ - 改进 malloc() 算法的下一步是什么?

c - 基本的,关于说明符

c - 编译c程序后如何获取.so文件?

c - 如何获得 tcp 套接字的当前 RTT 估计?

c++ - 在 unix 中如何关闭管道句柄? (pclose() 的 fclose())?

c - 非阻塞 UDP 端口打开时打开文件失败

c - 为什么在 malloc() 导致 free() : invalid next size (fast) 之后无效的 memset()

c - C中的结构体数组

c - free() 使用不同的指针释放相同的堆内存