buf
是通过malloc()
分配的字符缓冲区,那么free(buf)
是否会设置/重置errno
?假设我想将缓冲区写入文件,然后释放它,因为我不再需要它。
假设代码的错误策略是在出错时返回-1。
这是一种正确的方法来写出缓冲区并进行错误检查,而不会泄漏内存吗?
fputs(buf, somefile);
free(buf);
if (errno) return -1;
还是说我需要考虑可能会设置errno的free函数,比如...
fputs(buf, somefile);
if (errno){
free(buf);
return -1;
}
free(buf);
或者,更可怕的是,
do {
fputs(buf, somefile);
int save_errno = errno;
free(buf);
errno = save_errno;
if (errno) return -1;
} while(0);
使用块允许在需要重用时在各个位置存在本地save_errno。所有这一切似乎取决于free()是否设置errno。
Linux man页面不仅适用于malloc()
等函数,还触及了malloc()
设置errno的问题,但未提到free()
是否会设置errno。
GNU C Library手册没有提到free()是否会设置errno。
因此,我编写了一个短程序来强制写入错误,以查看free()是否重置了errno,但它并没有重置。我在思考是否应该依赖这个结果和free()是如此关键,以至于 "当然它不会设置errno"。
# See if free() resets errno on a bad write
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv)
{
char * buf = malloc(256);
snprintf(buf,256,"%s\n", "Hello, World!");
FILE *badfile;
badfile = fopen("/dev/null","r");
fputs(buf, badfile);
free(buf);
printf("%d\n", errno);
printf("%s\n", strerror(errno));
}
errno
的值,包括那些没有失败的函数调用,errno
的值是未定义的。换句话说,在上一个调用显式失败之前,请不要检查errno
。因此需要注意。 - Some programmer dudefree
的“滥用”,例如尝试两次释放同一指针,不一定会崩溃,它只是未定义的。虽然在许多情况下,未定义的行为会导致崩溃。 - Some programmer dudedo {...} while(0);
的结构,你也可以用简单的花括号{...}
来创建代码块。 - Quentin