cJSON内存泄漏

3

我在程序中使用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);
}

这个程序运行良好,但是在一段时间后我发现由于异常的内存使用或设备崩溃(在Cortex A8上),Linux(嵌入式)会关闭我的程序。通过调试,我发现即使我在结尾处删除指针,泄漏问题仍然出现在这个函数中。有人能看出这个泄漏吗?


那么,当这个函数为空时(或者你不调用它时),内存泄漏会消失吗? - meaning-matters
是的,我只是注释了这个函数,在终端中使用“ps”检查了我的程序,并查看了稳定的内存使用情况。取消注释后,看到这个值在缓慢上升,但工作10分钟后它会挂起系统,所以我无法再连接到它。 - PaulPonomarev
好的。如果你注释掉 fprintf() 这一行呢? - meaning-matters
现在这是我最不怀疑的。但你是对的。泄漏在fprintf函数中。但为什么和如何修复它? - PaulPonomarev
2个回答

8

起初我以为可能是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);

好的,我尝试在fprintf之后添加fflush,并在写入fprintf(this->outstream, "\n%s\n", cJSON_Print(jout)); fflush(this->outstream);之前(和之后)添加"\n"。但是没有帮助。然后我尝试使用描述符而不是fprintf写入文件:int df = fileno(this->outstream); write(df, cJSON_Print(jout), sizeof(cJSON_Print(jout)));首先-它没有起作用,其次-它还创建了内存泄漏。 - PaulPonomarev
是的!现在内存使用稳定了。唯一要注意的是,当我创建char*时,需要使用标准函数free(text) - PaulPonomarev
@PaulPonomarev:你还需要检查cJSON_Print是否返回了一个NULL指针。(所有的cJSON函数已经检查了NULL指针) - FSMaxB
2
请考虑更改为 cJSON_free API(请参见维护者的评论 https://github.com/DaveGamble/cJSON/issues/5) - Chris Merck

-2
针对已分配的 char* cJSON_Print,建议使用 cJSON_FreePrintBuffer。

2
正确的API是cJSON_free - Chris Merck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接