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(jout, "V2", cJSON_CreateNumber(somevalues.v2));
    fprintf(this->outstream, "%s", cJSON_Print(jout));
    cJSON_Delete(jout);
}

效果很好,但一段时间后我发现 Linux(嵌入式)由于内存使用异常或设备(在 Cortex A8 上)挂起而终止了我的程序。调试后我发现,即使我在最后删除了指针,该泄漏也恰好出现在此函数中。谁能看到泄漏?

最佳答案

最初我认为它可能是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);

关于cJSON内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26158734/

相关文章:

c# - 在不安全模式下使用 64 位指针访问 16 位数组

c - 对 C 内存池中的内存块进行碎片整理

c++ - SendInput() 键盘字母 C/C++

C 整数行为 : Dividing by Zero

javascript - AngularJS 评估函数中的字符串以调用 json 列表上的属性

javascript - jQuery mobile - 从 json 文件加载到 ListView 的数据刷新后会中断

javascript - 在 JavaScript 中,是否有一种将数字转换为字符串的解析 JSON 的方法?

c - 为什么编译器在将 int(不是 int *)作为 scanf() 的参数传递时不发出错误?

c - 为什么这个 offsetof() 的实现有效?

我可以在指向 void 指针的指针上使用指针算术吗?