`cJSON_Delete` 接口和 `cJSON_free` 接口不能混用,尤其是 json 对象必须使用`cJSON_Delete` 接口进行释放,因为 `cJSON_delete` 接口会递归释放一个 json 体内的所有对象,而 `cJSON_free` 只会进行一次释放。
接口 | 功能 | 输出 | 释放方法 |
cJSON_CreateObject | 生成一个空白的 json 对象 | 一个 json 对象 | cJSON_Delete |
cJSON_Parse | 将 json 字符串解析成 json 对象 | 一个 json 对象 | cJSON_Delete |
cJSON_ParseWithLength | 将固定长度 json 字符串解析成 json 对象 | 一个 json 对象 | cJSON_Delete |
cJSON_Duplicate | 复制一个 json 对象 | 一个 json 对象 | cJSON_Delete |
cJSON_Print | 将 json 对象解析成格式化的 json 字符串 | 一个 json 字符串 | cJSON_free |
cJSON_PrintUnformatted | 将 json 对象解析成无格式化的 json 字符串 | 一个 json 字符串 | cJSON_free |
cJSON_PrintPreallocated | 将 json 对象解析成 json 字符串 | 一个 json 字符串 | cJSON_free |
在使用时尽可能明确使用的接口返回的到底是引用还是实体对象,如果是实体对象的话,到底是应该使用 cJSON_Delete 方法释放的 json 对象还是 cJSON_free 释放的除了 json 对象以外的其他对象。其本质是, json 对象在进行创建时可能是多次 malloc 生成的嵌套对象,对象中的指针元素可能并不为空,而其他对象,如字符串等,是通过一次调用 cJSON_malloc 接口开辟的空间,非嵌套对象,可通过一次 cJSON_free 接口释放。
同时应注意,cJSON_malloc/cJSON_free 接口并不一定等同于 malloc/free 接口,所以调用 cjson 相关接口生产的对象,使用 vjson 的接口释放,而不用通过类似 free 之类的接口释放