Memory leak with json_object_get_string

709 Views Asked by At

I am quite new in C, and I am using the json-c library. I am completely sure that the problem I have is with json_object_get_string, because if I don't use it and put a string manually in my structure it works in valgrind without any memory leak.

I put a reduced version to make it clearer.

struct Example {
    char *id;
    char *name;
    char *logPath;
};

struct Examples {
    struct Example *examples;
    size_t size;
};

struct Examples list() {

    size_t i, count = 0;
    struct Example *examples = NULL;

    for (i = 0; i < 59; i++) {

        json_object *root_obj = json_object_from_file("path.json");
        json_object *jID;
        json_object *jName;
        json_object *jLogPath;

        if (json_object_object_get_ex(root_obj, "Name", &jName) ==
                TRUE &&
            json_object_object_get_ex(root_obj, "LogPath", &jLogPath) ==
                TRUE &&
            json_object_object_get_ex(root_obj, "ID", &jID) == TRUE) {
            char *id = strdup(json_object_get_string(jID));
            char *name = strdup(json_object_get_string(jName));
            char *logPath = strdup(json_object_get_string(jLogPath));
            json_object_put(root_obj);
            count++;

            struct Examples *tmpExamples = realloc(examples, count * sizeof(struct Example));
            if (tmpExamples == NULL) {
                if (examples) {
                    free(examples);
                }
                die("Realloc");
            }
            struct Example example = { id, name, logPath };

            examples = tmpExamples;
            examples[i] = container;
    }

    struct Examples examplesList = { examples, count };

    return examplesList;
}

I have tried to free the variables that I have assigned with strdup after adding it to the struct, but then I lose the real value of the string. I don't really understand what happens.

1

There are 1 best solutions below

0
On

In the end I have not complicated with so much char pointer and the chars of the struct I have put it as char array if I can name it that way

struct Example {
    char id[64];
    char name[30];
    char logPath[165];
};

struct Example example;
strcpy(example.id, json_object_get_string(jID));
strcpy(example.name, json_object_get_string(jName));
strcpy(example.logPath, json_object_get_string(jLogPath));
json_object_put(root_obj);