3

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?

Sled
  • 18,541
  • 27
  • 119
  • 168
hopia
  • 4,880
  • 7
  • 32
  • 54
  • 1
    possible duplicate of [cJSON memory leak](http://stackoverflow.com/questions/26158734/cjson-memory-leak) – SSC Dec 10 '14 at 06:18

2 Answers2

7

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.

Natasha Dutta
  • 3,242
  • 21
  • 23
4

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);
    }
}
Chris Merck
  • 454
  • 3
  • 12