我是否需要在 C 中释放 strerror() 的结果?
Do I need to free the result of strerror() in C?
据我理解,strerror(errno)
returns errno
对应的错误的字符串形式。那样的话,函数的返回结果是否需要在使用完后释放?
strerror
的 return 值 不需要 需要释放。它通常指向只读字符串或静态缓冲区。因此,该函数不被认为是线程安全的。
有一个名为 strerror_r
的相关函数,它采用用户指定的缓冲区及其大小,并用错误消息填充缓冲区。这个函数是线程安全的。
你不仅不需要;你一定不能。您可以传递给 free
的唯一东西是指向您通过 malloc
获得的内存的指针或指定给 return 内存的函数的指针,这些内存通过 malloc
或 "as if by malloc
" 获得。 strerror
的规范中没有这样的文本,因此将字符串 it returns 传递给 free
会产生未定义的行为。特别是,如果实现在内部使用 malloc
来获取内存,您将释放内存,导致它执行释放后使用或双重释放,这是一些最危险的内存错误的类型。
实际上,strerror
通常 returns 来自 libc .rodata
或来自 mmap
ped 翻译文件的不可变字符串,并且很可能会立即出现错误撞车了。
据我理解,strerror(errno)
returns errno
对应的错误的字符串形式。那样的话,函数的返回结果是否需要在使用完后释放?
strerror
的 return 值 不需要 需要释放。它通常指向只读字符串或静态缓冲区。因此,该函数不被认为是线程安全的。
有一个名为 strerror_r
的相关函数,它采用用户指定的缓冲区及其大小,并用错误消息填充缓冲区。这个函数是线程安全的。
你不仅不需要;你一定不能。您可以传递给 free
的唯一东西是指向您通过 malloc
获得的内存的指针或指定给 return 内存的函数的指针,这些内存通过 malloc
或 "as if by malloc
" 获得。 strerror
的规范中没有这样的文本,因此将字符串 it returns 传递给 free
会产生未定义的行为。特别是,如果实现在内部使用 malloc
来获取内存,您将释放内存,导致它执行释放后使用或双重释放,这是一些最危险的内存错误的类型。
实际上,strerror
通常 returns 来自 libc .rodata
或来自 mmap
ped 翻译文件的不可变字符串,并且很可能会立即出现错误撞车了。