SORU
1 HAZİRAN 2015, PAZARTESİ


Ü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
1 HAZİRAN 2015, PAZARTESİ


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;

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AmeriiK_HD

    AmeriiK_HD

    16 AĞUSTOS 2012
  • Autodesk 3ds Max Learning Channel

    Autodesk 3ds

    23 HAZİRAN 2010
  • RocketJump

    RocketJump

    22 ŞUBAT 2006