zne*_*eak 7 c memory-management return-value
有许多函数(特别是在POSIX库中)返回几乎必然是新分配数据的指针.他们的联机帮助文件没有说明你是否应该释放它们,或者是否有一些模糊的机制在起作用(比如返回指向静态缓冲区的指针,或沿着这些行的东西).
例如,该inet_ntoa函数char*最不可能返回,但是联机帮助页没有说明它是如何分配的.我最终使用了,inet_ntop因为至少我知道目的地分配来自哪里.
返回指针的C函数的标准规则是什么?谁负责释放他们的记忆?
确实没有标准规则。有些函数需要您传入一个指针,然后它们将数据填充到该空间中(例如,sprintf)。其他函数返回静态数据区域的地址(例如, 中的许多函数<time.h>)。其他人仍然在需要时分配内存(例如,setvbuf)。
您能做的最好的事情就是希望文档告诉您需要释放哪些指针。除非文档告诉您,否则您通常不应尝试释放它返回的指针。除非您传入缓冲区的地址供其使用,或者指定您需要释放内存,否则您通常应该假设它正在使用静态数据区域。这意味着(除其他外)您应该假设该值将因对同一例程的任何后续调用而更改。如果您正在编写多线程代码,您通常应该假设该函数并不是真正的线程安全——您有一个需要同步的共享数据区域,因此您应该获取一个锁,调用该函数,将数据复制出来其数据区,然后才释放锁。