cJSON内存泄漏

cJSON内存泄漏,c,json,pointers,memory-leaks,cjson,C,Json,Pointers,Memory Leaks,Cjson,我在程序中使用cJSON将我的值转换为JSON并将其写入文件。下面是我的代码示例: void writeStructToFile(IOPipe this, struct structtype somevalues) { cJSON *jout = cJSON_CreateObject(); cJSON_AddItemToObject(jout, "V1", cJSON_CreateNumber(somevalues.v1)); cJSON_AddItemToObject(

我在程序中使用cJSON将我的值转换为JSON并将其写入文件。下面是我的代码示例:

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上)刚刚挂起。调试后,我发现,即使我在最后删除了指针,该泄漏仍会准确地出现在该函数中。有人能看到那个漏洞吗?

起初我认为它可能是
文件
I/O的内部缓冲区。但当它们变得太大时,会自动冲洗

真正的漏洞是
cJSON\u Print
分配内存:一个
char
数组。完成后,您必须释放此文件:

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

cJSON_Delete(jout);

对于char*分配的cJSON_打印,据说使用cJSON_FreePrintBuffer。

那么,当此函数为空时(或当您不调用它时),内存泄漏是否会消失?是的,刚刚注释了此函数,在终端中用“ps”检查了我的程序,并查看了稳定的内存使用情况。取消注释并看到该值缓慢上升,但在工作10分钟后,它会挂起系统,因此我无法再次连接到它。如果您注释掉
fprintf()
行会怎么样?现在这是我最不怀疑的。但你是对的。fprintf函数中存在泄漏。但是为什么以及如何修复它呢?好的,我尝试在fprintf之后添加fflush,在写入
fprintf(this->outstream,“\n%s\n”,cJSON\u Print(jout))之前(和之后)添加“\n”;fflush(此->超出流)。没有帮助。然后我尝试用描述符而不是fprintf写入文件:
intdf=fileno(this->outstream);写入(df、cJSON_Print(jout)、sizeof(cJSON_Print(jout))首先-它不工作,其次-它造成了内存泄漏是的!现在内存使用是稳定的。唯一的问题是当我创建char*时,我需要使用标准函数
free(text)
@palponomarev:您还需要检查
cJSON\u Print
是否返回
NULL
指针。(所有CJSON函数检查<代码> null <代码>指针已经开始)请考虑更改为<代码> CjSun-Fiels API(见维护者注释)正确的API是代码> CjSunnFiels