Если buf
является malloc()
выделенным буфером char, устанавливает free(buf)
/reset errno
?
Скажем, я хочу записать буфер в файл, а затем освободить его, поскольку он мне больше не нужен.
Скажем, что политика ошибки для кода - вернуть -1 на ошибку.
Является ли это правильным способом записи буфера и проверки ошибок без утечки памяти?
fputs(buf, somefile);
free(buf);
if (errno) return -1;
Или мне нужно рассмотреть возможность бесплатной установки errno, как в...
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 бесплатно() также является справочной страницей для malloc()
и т.д. В ней упоминается malloc()
настройка errno, но не free()
.
Страница руководства библиотеки GNU C для освобождения динамической памяти не упоминает, устанавливает ли free() errno.
Итак, я написал короткую программу для принудительной записи ошибки, чтобы я мог видеть, есть ли free() reset 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));
}