2014-10-02 617 views
1

我在我的程序中使用cJSON将我的值转换为JSON并将其写入文件。这里是我的代码的例子:cJSON内存泄漏

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); 
} 

伟大的作品,但过一段时间后,我发现,Linux操作系统(嵌入式)杀死,因为异常内存使用或设备(上Cortex A8的)我的程序只是挂起。在调试后我发现,即使我在最后删除指针,该泄漏也完全出现在该函数中。任何人都可以看到泄漏?

+0

那么,当这个函数为空(或者当你没有调用它)时,内存泄漏会消失吗? – 2014-10-02 10:21:46

+0

是的,只是评论了这个功能,在终端中用“ps”检查我的程序,并看到稳定的内存使用情况。没有注释,看到这个值慢慢上升,但是在工作10分钟后它挂起系统,所以我不能再次连接它 – PaulPonomarev 2014-10-02 10:28:43

+0

好吧。如果你注释掉'fprintf()'行呢? – 2014-10-02 10:46:42

回答

5

最初我以为它可能是FILE I/O的内部缓冲区。但是当它们变得太大时会自动刷新。

真正的泄漏是cJSON_Print分配内存:一个char数组。你必须大功告成后释放此:

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

cJSON_Delete(jout); 
+0

好吧,我已经尝试在写入fprintf(this-> outstream,“\ n%s \ n”,cJSON_Print(jout))之前(和之后)fprintf和“\ n”之后添加fflush; fflush(这 - > outstream);'。没有帮助。然后我试着用描述符而不是fprintf写入文件:'int df = fileno(this-> outstream);写(df,cJSON_Print(jout),sizeof(cJSON_Print(jout)));'首先 - 它没有工作,其次 - 它也造成内存泄漏 – PaulPonomarev 2014-10-06 06:57:31

+0

是的!现在内存使用情况稳定。只有当我创建char *时,我需要使用标准函数'free(text)' – PaulPonomarev 2014-10-06 09:53:15

+0

@PaulPonomarev:您还需要检查'cJSON_Print'是否不返回NULL指针。 (所有的cJSON函数都检查NULL指针) – FSMaxB 2018-02-02 16:59:08

0

对于一个char *分配cJSON_Print,据说使用cJSON_FreePrintBuffer。

+0

根据https://github.com/DaveGamble/cJSON/issues/190 – JKOlaf 2017-10-24 23:52:09