C Freigabe von Speicher nach strdup()

Mache ich eine Lektion aus der Learn C the Hard way online-Kurs. Im code-Beispiel unten, ich verstehe nicht, warum die zwei free() Anrufe notwendig sind. Ich dachte, man bräuchte nur zu rufen free() einmal, weil nur eine malloc() Auftritt. Könnte jemand klären, warum brauchen wir zwei?

Wenn ich kommentieren free(who->name); dann valgrind sagt mir, dass ich verloren habe, ein Stück 'a-Speicher, wie so;

LEAK SUMMARY:
definitely lost: 21 bytes in 2 blocks

Hier der code:

#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;
}
Denn auch strdup() Speicher reserviert, dann muss es freigegeben werden (siehe doc).
strdup ist ein malloc im Unglück.
Lesen Sie die Dokumentation der standard-Funktion schneller als bitte auf DAMIT !
strdup ist kein Standard-C-Funktion, allerdings ist es im POSIX. (Keine Standard-C-Funktionen geben einen Zeiger, erfordert die Befreiung, andere als malloc, calloc, realloc).
eine standard-Funktion kann erwähnt werden, dass in einigen anderen standard als C99. Posix ist ein solcher standard.

InformationsquelleAutor Andy J | 2014-07-29

Schreibe einen Kommentar