【发布时间】:2020-09-28 01:13:11
【问题描述】:
据我了解,strerror(errno) 返回与errno 对应的错误的字符串形式。这种情况下,函数的返回结果是否需要在我用完后释放?
【问题讨论】:
标签: c memory-management memory-leaks
据我了解,strerror(errno) 返回与errno 对应的错误的字符串形式。这种情况下,函数的返回结果是否需要在我用完后释放?
【问题讨论】:
标签: c memory-management memory-leaks
你不仅不需要;您不得。您可以传递给free 的唯一内容是指向您通过malloc 获得的内存的指针,或指定返回通过malloc 获得的内存的函数或“如同malloc”获得的内存。 strerror 的规范中没有这样的文本,因此将它返回的字符串传递给 free 会产生未定义的行为。特别是,如果实现在内部使用malloc 来获取内存,那么您将从它下面释放该内存,导致它执行释放后使用或双重释放,这是一些最危险的类型内存错误。
在实践中,strerror 通常会从 libc .rodata 或 mmapped 翻译文件返回不可变字符串,并且该错误很可能会立即被捕获为崩溃。
【讨论】:
strerror 的返回值不需要需要被释放。它通常指向只读字符串或静态缓冲区。因此,这个函数不被认为是线程安全的。
有一个名为strerror_r 的相关函数,它获取用户指定的缓冲区及其大小,并用错误消息填充缓冲区。这个函数是线程安全的。
【讨论】: