我在程序中使用 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);
我在 ESP32 上发现了一个问题,我可以这样修复它:
const char * jsonString = cJSON_PrintUnformatted(doc);
//...
cJSON_free((void*)jsonString);
cJSON_Delete(root);
对于 char* 分配的 cJSON_Print,据说使用 cJSON_FreePrintBuffer。