当第三方C函数返回指针时,你应该自己释放吗?

zne*_*eak 7 c memory-management return-value

有许多函数(特别是在POSIX库中)返回几乎必然是新分配数据的指针.他们的联机帮助文件没有说明你是否应该释放它们,或者是否有一些模糊的机制在起作用(比如返回指向静态缓冲区的指针,或沿着这些行的东西).

例如,该inet_ntoa函数char*最不可能返回,但是联机帮助页没有说明它是如何分配的.我最终使用了,inet_ntop因为至少我知道目的地分配来自哪里.

返回指针的C函数的标准规则是什么?谁负责释放他们的记忆?

CB *_*ley 12

你必须阅读文档,没有其他方法.我的阅读手册页inet_ntoa:

该字符串在静态分配的缓冲区中返回,后续调用将覆盖该缓冲区.

因此,在这种情况下,您不能尝试释放返回的指针.


Jer*_*fin 3

确实没有标准规则。有些函数需要您传入一个指针,然后它们将数据填充到该空间中(例如,sprintf)。其他函数返回静态数据区域的地址(例如, 中的许多函数<time.h>)。其他人仍然在需要时分配内存(例如,setvbuf)。

您能做的最好的事情就是希望文档告诉您需要释放哪些指针。除非文档告诉您,否则您通常不应尝试释放它返回的指针。除非您传入缓冲区的地址供其使用,或者指定您需要释放内存,否则您通常应该假设它正在使用静态数据区域。这意味着(除其他外)您应该假设该值因对同一例程的任何后续调用而更改。如果您正在编写多线程代码,您通常应该假设该函数并不是真正的线程安全——您有一个需要同步的共享数据区域,因此您应该获取一个锁,调用该函数,将数据复制出来其数据区,然后才释放锁。