Ücretsiz() bir hata oluştuğunu hazır mı?
Eğer buf
malloc()
ayrılan bir char buffer, free(buf)
/errno
reset batıyor?
Hadi bir dosyaya yazma arabelleği, ve herhangi bir daha fazla ihtiyacım yok, boş o zaman.
Hadi kodu için hata politikası bir hata oluştu ise -1 dönmek için olduğunu söylüyorlar.
Bu uygun bir bellek sızıntısı olmadan tampon ve hata onay yazmak için mi?
fputs(buf, somefile);
free(buf);
if (errno) return -1;
Ya ben belki bir hata oluştuğunu özgür düşünün, ister...
fputs(buf, somefile);
if (errno){
free(buf);
return -1;
}
free(buf);
ya da, dehşet korku,
do {
fputs(buf, somefile);
int save_errno = errno;
free(buf);
errno = save_errno;
if (errno) return -1;
} while(0);
bir blok kullanımı yerel bir save_errno çeşitli yerlerde bulunması için izin kullanılmaması gereken bu.
Tüm bunlar ücretsiz mi bağlıdır gibi görünüyor() bir hata oluştuğunu ayarlar.
linux man page for free() de malloc()
vs. adam sayfasıdır. malloc()
ayarı hata, ama free()
bahseder.
GNU C Library manual page for freeing dynamic memory özgür olsun söz etmez() bir hata oluştuğunu ayarlar.
Bedava diye bu kadar kısa bir program bir hata yazma zorlamak için yazdım() hata sıfırlama, ve değildir. Eğer bu sonuç ve ücretsiz gerçeğini güvenmek gerektiğini merak ediyorum () "elbette bir hata oluştuğunu set değil." bu çok önemlidir
# 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));
}
CEVAP
POSIX free
errno
(POSIX şu anda yasaklama olmamasına rağmen, bir uygulama bunu yapmak olabilir - 25* *daha fazla ayrıntı için bakınız) ayarlamak için tanımlama yok. Ama ilginiz için gerçekten uygun değil.
Hataları kontrol etme şeklin yanlış. fputs
, dönüş değeri kontrol edin ve eğer 0
daha küçük olup olmadığını kontrol etmelisiniz. Eğer öyleyse, o errno
yetmezliğinin nedenini öğrenmek için kontrol edebilirsiniz, ama bu isteğe bağlı (ve herhangi bir diğer işlevler çağrılmadan önce yapılmalıdır).
Yani, bu hile yapmak gerekir gibi
int result = fputs(buf, somefile);
/* optionally read errno here if result < 0 (before the free call) */
free(buf);
return (result < 0) ? -1 : 0;
Bir hata oluştuğunu güvenli iş parçacı...
Mysql. Can't create table bir hat...
WAMP hata 'MSVCR100 gösterir....
Çok kademeli girişler için gıt ölümcül...
Bir "belirsiz yönlendirme" h...