c - 修改通过解析字符串文字创建的 cJSON 结构时出现段错误

标签 c cjson

当使用 cJSON 解析字符串文字时,我在释放 cJSON 结构时遇到段错误。

原代码如下:

char* jsonStr = "{ \"command\" : { \"param1\": \"value1\", \"param2\": \"value2\" } }";
cJSON *jsonMsg = cJSON_Parse(jsonStr);
cJSON *command = CJSON_GetObjectItem(jsonMsg, "command");
cJSON_GetObjectItem(command,"param1")->valuestring = "new value 1";
cJSON_Delete(jsonMsg); // <— segmentation fault

最佳答案

当我第一次遇到这种情况时,我对这种行为感到困惑。该示例与 cJSON documentation 中的示例非常相似.

我第一次尝试解决方案是设置“param1”的类型,以便 cJSON_Delete() 函数不会尝试释放内存。即,在 cJSON->type 成员中设置“cJSON_IsReference”标志。

更新后的代码是:

char* jsonStr = "{ \"command\" : { \"param1\": \"value1\", \"param2\": \"value2\" } }";
cJSON *jsonMsg = cJSON_Parse(jsonStr);
cJSON *command = CJSON_GetObjectItem(jsonMsg, "command");
cJSON_GetObjectItem(command,"param1")->valuestring = "new value 1";
cJSON_GetObjectItem(command,"param1")->type |= cJSON_IsReference;
cJSON_Delete(jsonMsg);

最终的解决方案是将原始消息的内容传输到新的 cJSON 对象中。这可以防止由于 cJSON_Parse() 分配的孤立内存而导致内存泄漏。

最终的代码如下所示:

char* jsonStr = "{ \"command\" : { \"param1\": \"value1\", \"param2\": \"value2\" } }";
cJSON *jsonMsg = cJSON_Parse(jsonStr);
cJSON *command = CJSON_GetObjectItem(jsonMsg, "command");

cJSON *jsonRes, *command;
jsonRes = cJSON_CreateObject();
command = cJSON_CreateObject()
cJSON_AddItemToObject(jsonRes, "command", command);
cJSON_AddStringToObject(command, cJSON_GetObjectItem(command,"param1")->string, "new value 1");
cJSON_AddItemToObject(jsonRes, "command", command = cJSON_CreateObject());
cJSON_AddStringToObject(command, 
    cJSON_GetObjectItem(command,"param2")->string, 
    cJSON_GetObjectItem(command,"param2")->valuestring);

cJSON_Print(jsonRes);

cJSON_Delete(jsonMsg);
cJSON_Delete(jsonRes);

关于c - 修改通过解析字符串文字创建的 cJSON 结构时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36968730/

相关文章:

c - 从相对路径获取绝对路径

cJSON内存泄漏

c - 使用 CJSON 解析的 JSON 中的第一个数字始终为 0

c - 整数数组(例如 : int a[]) in c: Why are wrong values being returned when I access them using a[i]. ?

c++ - 第一次使用 PCH,出现链接器工具错误

lua - Redis cjson : Is there a way to manipulate JSON without decoding it completely?

cJSON解析建议

cJSON内存泄漏

c - Microsoft Visual Studio 中的断言错误是什么?和未处理的异常访问冲突?

c - 在C中使用字符串数组