这是对我之前的问题的跟进。 link here
我的问题是:假设我有以下代码..
char* buf = (char*) malloc(1024);
...
for(; i<20; i++) {
if(read(fd, buf, 1024) == -1) { // read off a file and store in buffer
perror("read failed");
return 1;
}
...
}
free(buf);
我想要的是 - 如果read()
发生错误怎么办?这是否意味着我分配的内存永远不会被释放?如果是这种情况,我该如何处理?作为错误处理的一部分,我应该调用free()
吗?
我再一次为糟糕的英语道歉。 ^^;
非常感谢,K。
答案 0 :(得分:3)
是的,内存将被泄露。
你可以这样做:
char* buf = (char*) malloc(1024);
int errcode = 0;
...
for(; i<20; i++) {
if(read(fd, buf, 1024) == -1) { // read off a file and store in buffer
perror("read failed");
errcode = 1;
break; // or "goto cleanup;"
}
...
}
free(buf);
return errcode;
答案 1 :(得分:3)
除非您使用非常小的堆栈运行非常约束的嵌入式CPU,否则没有理由从堆中分配该缓冲区。一千字节是花生。将您的声明更改为:
char buf[1024];
您可以退出您的功能而无需清理。
答案 2 :(得分:1)
这取决于您是否认为错误可以恢复。
如果您认为错误可能是可恢复的,并且您的函数返回错误代码(或以某种方式向调用方发出信号),请确保释放内存以及将不使用的任何其他资源(如文件描述符)试。
如果您认为错误无法恢复,并且您退出程序(通过abort
或类似的东西),请不要担心释放资源。当你的程序退出时,系统会为你处理它。