где утечка памяти в коде ниже? - PullRequest
0 голосов
/ 09 января 2020

Можете ли вы, ребята, помочь мне определить, где утечка памяти?

void foo(char *name){
    char * p = (char *)malloc(1024);
    char * buf = (char *)malloc(1024);
    sprintf(p, "User name: %s", name);
    printf("Format string is %s\n", p); 
    buf = p;
    free(p);
    free(buf);
}

Ответы [ 2 ]

3 голосов
/ 09 января 2020
  1. Вы выделяете блок памяти, который мы назовем BLOCK1. p изначально указывает на BLOCK1.
  2. Вы выделяете блок памяти, который мы будем называть BLOCK2. buf изначально указывает на BLOCK2.
  3. buf изменяется на значение BLOCK1 (buf = p;). Ничто не указывает на BLOCK2 сейчас. Утечка памяти.
  4. Вы освобождаете BLOCK1 (free(p)), но никогда не освобождаете BLOCK2.

Кроме того, вы вызываете неопределенное поведение , пытаясь освободить блок, который уже был освобожден (free(buf)).

Если вы пытаетесь скопировать строку, вместо buf = p;.

следует использовать strncpy или strcpy. Если вы пытаетесь скопировать указатель, выделите только один блок (используя char *buf = p; вместо char *buf = malloc(...); buf = p;).

0 голосов
/ 10 января 2020

это утечка памяти:

buf = p;

, поскольку она накладывает один из указателей на выделенную память.

Однако из-за вышеприведенного оператора этот оператор:

free(buf);

вызовет программу cra sh, потому что память, указанная как buf, уже передана free()

, поэтому две ошибки в опубликованном коде.

Чтобы все это исправить, удалите это утверждение:

buf = p;
...