Я делаю урок из Learn C the Hard way онлайн-курс. В примере кода ниже я не понимаю, почему нужны два вызова free()
. Я думал, что нужно только позвонить free()
один раз, потому что наступает только один malloc()
. Может кто-нибудь уточнить, почему нам нужны два?C - Свободная память после strdup()
Если я прокомментирую free(who->name);
, тогда valgrind
сообщает мне, что я потерял память о памяти;
LEAK SUMMARY:
definitely lost: 21 bytes in 2 blocks
Вот код:
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
struct Person {
char *name;
int age;
int height;
int weight;
};
struct Person *Person_create(char *name, int age, int height, int weight)
{
struct Person *who = malloc(sizeof(struct Person));
assert(who != NULL);
who->name = strdup(name);
who->age = age;
who->height = height;
who->weight = weight;
return who;
}
void Person_destroy(struct Person *who)
{
assert(who != NULL);
free(who->name); /* Why this one??! */
free(who);
}
int main(int argc, char *argv[])
{
// make two people structures
struct Person *joe = Person_create(
"Joe Alex", 32, 64, 140);
struct Person *frank = Person_create(
"Frank Blank", 20, 72, 180);
// destroy them both so we clean up
Person_destroy(joe);
Person_destroy(frank);
return 0;
}
Поскольку также strdup() выделяет память, тогда он должен быть освобожден (см. [Doc] (http://man7.org/linux/man-pages/man3/strdup.3.html)). –
'who-> name = strdup (name);' здесь вы выделяете память, то есть strdup() выделяет. –
'strdup' является маскировкой' malloc'. – AnT