Should the return value of cJSON_Print() be freed by the caller?

6.4k views Asked by At

I am using the cJSON library and I have a function as follows:

void printJsonObject(cJSON *item)
{
    char *json_string = cJSON_Print(item);
    printf("%s\n", json_string);
}

Will this function leak memory?

2

There are 2 answers

1
Natasha Dutta On BEST ANSWER

I've never used cJSON , but as per the function definition present in this link, it looks like

char *cJSON_Print(cJSON *item)  {return print_value(item,0,1);} 

and

static char *print_value(cJSON *item,int depth,int fmt);

From print_value() function, the pointer returned is allocated by cJSON_strdup() [which is a modified version of the combination of malloc() and memcpy()] and it is returned to the caller.

As I see no method to track the allocation, IMO, the allocated memory needs to be free()d by the caller function. Otherwise, it will be a memory leak.

0
Chris Merck On

Yes, it is a memory leak.

Buffers returned by cJSON_Print must be freed by the caller. Please use the proper API (cJSON_free) rather than directly calling stdlib free.

See the cJSON maintainer's comment: https://github.com/DaveGamble/cJSON/issues/5#issuecomment-298469697


I recommend:

void printJsonObject(cJSON *item)
{
    char *json_string = cJSON_Print(item);
    if (json_string) 
    {
        printf("%s\n", json_string);
        cJSON_free(json_string);
    }
}