C Программирование: вызов free () при ошибке? - PullRequest
1 голос
/ 20 марта 2010

Это продолжение моего предыдущего вопроса. ссылка здесь .

Мой вопрос: скажем, у меня есть следующий код ..

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() как часть обработки ошибок?

Еще раз прошу прощения за плохой английский. ^^;

Большое спасибо, К.

Ответы [ 3 ]

3 голосов
/ 20 марта 2010

Если вы не используете встроенный процессор с очень малым с очень маленьким стеком, нет причин выделять этот буфер из кучи.Один килобайт - это арахис.Измените свою декларацию следующим образом:

char buf[1024];

, и вы можете выйти из функции без необходимости очистки.

3 голосов
/ 20 марта 2010

Да, память будет утечка.

Вы можете сделать это так:

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 голос
/ 20 марта 2010

Это зависит от того, считаете ли вы ошибку исправимой или нет.

Если вы считаете, что ошибка может быть исправлена, и ваша функция возвращает код ошибки (или как-то сигнализирует вызывающей стороне), обязательно освободите память и любые другие ресурсы (например, дескрипторы файлов), которые не будут использоваться еще раз.

Если вы не думаете, что ошибка исправима, и вы выходите из программы (через abort или что-то подобное), не беспокойтесь об освобождении ресурсов. Система позаботится об этом при выходе из программы.

...