1

这是对我之前的问题的跟进。链接在这里

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

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。

4

3 回答 3

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;
于 2010-03-20T14:07:17.227 回答
3

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

char buf[1024];

您可以退出您的功能而无需清理。

于 2010-03-20T14:44:27.150 回答
1

这取决于您是否认为错误可恢复。

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

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

于 2010-03-20T14:50:19.747 回答