C编程:错误时调用free()?

C编程:错误时调用free()?,c,free,malloc,C,Free,Malloc,这是我上一个问题的后续行动 我的问题是:假设我有以下代码 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); 我想

这是我上一个问题的后续行动

我的问题是:假设我有以下代码

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);
我想说的是,如果读取时发生错误怎么办?这是否意味着我分配的内存永远不会被释放?如果是这样,我该如何处理?作为错误处理的一部分,我应该免费打电话吗

我再一次为糟糕的英语道歉。^^


非常感谢,K.

是的,内存将泄漏

您可以这样做:

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;

是的,内存会泄漏

您可以这样做:

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;
除非您运行在一个非常受限的嵌入式CPU上,并且堆栈非常小,否则没有理由从堆中分配该缓冲区。一千字节是花生。将您的声明更改为:

char buf[1024];
您可以不必清理就退出函数。

除非您运行在一个非常受限制的嵌入式CPU上,并且堆栈非常小,否则没有理由从堆中分配该缓冲区。一千字节是花生。将您的声明更改为:

char buf[1024];

您可以在不必清理的情况下退出您的函数。

这取决于您是否考虑了错误的可恢复性。

如果您认为错误可能是可恢复的,并且您的函数返回错误代码或以某种方式向调用者发出信号,请确保释放内存和任何其他资源,例如不再使用的文件描述符


如果您认为错误是不可恢复的,并且您通过abort或类似的方式退出程序,那么不要担心释放资源。当你的程序退出时,系统会为你处理它。

< P>这取决于你是否考虑了错误的可恢复性。 如果您认为错误可能是可恢复的,并且您的函数返回错误代码或以某种方式向调用者发出信号,请确保释放内存和任何其他资源,例如不再使用的文件描述符


如果您认为错误是不可恢复的,并且您通过abort或类似的方式退出程序,那么不要担心释放资源。当程序退出时,系统将为您处理它。

根据操作系统的不同,当进程退出时,内存将自动释放。@Jens:没有迹象表明OP的函数是int main。缺少标签清理:在freebuf之前;调用。@tomlogic:如果我真的使用goto,将有一个cleanup:label。根据操作系统的不同,当进程退出时,内存将自动释放。@Jens:没有迹象表明OP的函数是int main。缺少标签cleanup:在freebuf之前;调用。@tomlogic:如果我真的使用goto,就会有一个cleanup:label。