据我所知,strerror(errno)
返回与errno
相对应的错误的字符串形式。在那种情况下,使用完函数后,是否需要释放该函数的返回结果?
不仅您不是需要;您必须。唯一可以传递给free
的东西是指向malloc
获得的内存的指针,或者是指定返回malloc
或“好像malloc
获得”的函数的函数。 strerror
的规范中没有这样的文本,因此将返回的字符串传递给free
会产生不确定的行为。特别是,如果实现在内部使用malloc
来获取内存,则您将从该内存中释放该内存,从而导致该内存执行“先释放后使用”或“两次释放”操作,这是一些最危险的类型内存错误。
实际上,strerror
通常从libc .rodata
或mmap
ped翻译文件返回不可变的字符串,并且很可能立即将错误捕获为崩溃。
strerror
的返回值确实不是需要释放。它通常指向只读字符串或静态缓冲区。因此,此功能不被认为是线程安全的。
有一个名为strerror_r
的相关函数,该函数采用用户指定的缓冲区及其大小,并用错误消息填充缓冲区。此函数是线程安全的。