3

I use cJSON in my program to convert my values to JSON and write it to file. Here is the example of my code:

void writeStructToFile(IOPipe this, struct structtype somevalues) {
    cJSON *jout = cJSON_CreateObject();
    cJSON_AddItemToObject(jout, "V1", cJSON_CreateNumber(somevalues.v1));
    cJSON_AddItemToObject(jout, "V2", cJSON_CreateNumber(somevalues.v2));
    fprintf(this->outstream, "%s", cJSON_Print(jout));
    cJSON_Delete(jout);
}

Works great, but after some time I found that Linux(embedded) kills my program because of abnormal memory use or device(on Cortex A8) just hangs. After debug I found, that leak appears exactly in this function even though I delete the pointer at the end. Could anyone see that leak?

Sled
  • 18,541
  • 27
  • 119
  • 168
PaulPonomarev
  • 355
  • 1
  • 4
  • 20

2 Answers2

8

Initially I thought that it might be FILE I/O's internal buffers. But these are flushed automatically when they become too big.

The real leak is that cJSON_Print allocates memory: a char array. You must free this after you're done:

char* text = cJSON_Print(jout);
fprintf(this->outstream, "%s", text);
free(text);  // As suggested by PaulPonomarev.

cJSON_Delete(jout);
meaning-matters
  • 21,929
  • 10
  • 82
  • 142
  • Ok, I've tried to add fflush after fprintf, and "\n" before(and after) writing `fprintf(this->outstream, "\n%s\n", cJSON_Print(jout)); fflush(this->outstream);`. Didn't help. Then I tried to write to file with descriptor instead of fprintf: `int df = fileno(this->outstream); write(df, cJSON_Print(jout), sizeof(cJSON_Print(jout)));` First of all - it didn't work, second - it created memory leak too – PaulPonomarev Oct 06 '14 at 06:57
  • Yes! Now memory usage is stable. Only thing is when I created char* I need to use standard function `free(text)` – PaulPonomarev Oct 06 '14 at 09:53
  • @PaulPonomarev: You also need to check that `cJSON_Print` doesn't return a `NULL` pointer. (all the cJSON functions check for `NULL` pointers already) – FSMaxB Feb 02 '18 at 16:59
  • 2
    Please consider changing to the `cJSON_free` API (see maintainers comment https://github.com/DaveGamble/cJSON/issues/5) – Chris Merck Jul 07 '18 at 18:17
-2

For a char* allocated cJSON_Print, it is said to use cJSON_FreePrintBuffer.

PLemoine
  • 3
  • 2