1

私はいくつかのCコードを手に入れました:

typedef struct {
    size_t len;
    size_t alloclen;
    char *buf;
} str;

void strnappnd(str **s, const char *buf, size_t n) {

    if ((*s)->len + n >= (*s)->alloclen) {
        size_t nalloclen = (*s)->len + n + 1;
        void *tmp = realloc((*s)->buf, nalloclen);
        if (!tmp) {
            printf("failure");
            exit(-1);
        }
        (*s)->buf = tmp;
        (*s)->alloclen = nalloclen;
    }
    memccpy((*s)->buf + (*s)->len, buf, '\0', n);
    (*s)->len += n;
    (*s)->buf[(*s)->len] = '\0';
}

void strfree(str **s) {
    free((*s)->buf);
    free(*s);
    *s = NULL;
}

明らかに、strnappnd は realloc 行でリークします。なんで?

4

4 に答える 4

1

検討:

void f() {
  str *s = (str *)malloc(sizeof(str));
  s->len = 5;
  s->alloclen = 5;
  s->buf = strdup("Hello");
  strnappend(&s, " World!", 7);
  free(s); /* courtesy of Eric */
}

そのようなものがあると、によって割り当てられたメモリがそのままrealloc()リークしf()ます。

于 2011-03-17T13:02:30.227 に答える
0

strfree() 関数を作成しますが、コード内では使用されません。メモリは、使用しない場合は常に解放する必要があります。

if (!tmp) {
    printf("failure");
    if (!(*s) && !((*s)->buf))
       strfree(&(*s));
    exit(-1);
}

strfree() を見ると、どこかに *s 用のメモリを予約しているように見えます。コードが終了する前に同じことを行います。

if (!(*s) && !((*s)->buf))
   strfree(&(*s));
于 2013-01-22T16:43:51.120 に答える
0

あなたが書いた場合

(*s)->buf = realloc((*s)->buf, nalloclen)

realloc失敗して が返された場合、割り当てられたメモリをまだ指しているポインターNULLが失われるため、これはメモリ リークになります。(*s)->buf

失敗すると終了するので問題ありませんが、静的アナライザーがexit?を無視する可能性があります。

于 2011-03-17T13:57:18.610 に答える