天天看點

cJSON_Delete調用時segmentfault

cJSON_Delete

cJSON_Delete釋放cJSON構造object時申請的記憶體資源
通常用法
    cJSON *json = cJSON_CreateObject();
    ...
    ...
    cJSON_Delete(json);
           

調用cJSON_Delete時産生segmentfault

錯誤段代碼:
    cJSON *json = cJSON_CreateObject();
    cJSON *payload = cJSON_CreateObject();
    ...
    cJSON_AddItemObject(json, "payloaf", payload);
    ...
    cJSON_Delete(payload);
    cJSON_Delete(json);

構造一個json對象 并把payload對象作為一個節點加入到json中
經過debug發現cJSON_Delete(json)時發生了記憶體越界通路

檢視cJSON源碼可以發現 cJSON_Delete會主動删除每個節點的資源
CJSON_PUBLIC(void) cJSON_Delete(cJSON *item)
{
    cJSON *next = NULL;
    while (item != NULL)
    {
        next = item->next;
        if (!(item->type & cJSON_IsReference) && (item->child != NULL))
        {
            cJSON_Delete(item->child);
        }
        if (!(item->type & cJSON_IsReference) && (item->valuestring != NULL))
        {
            global_hooks.deallocate(item->valuestring);
        }
        if (!(item->type & cJSON_StringIsConst) && (item->string != NULL))
        {
            global_hooks.deallocate(item->string);
        }
        global_hooks.deallocate(item);
        item = next;
    }
}
           
是以建立使用cJSON構造json對象後 隻需要調用cJSON_Delete删除json對象即可
節點的資源會被一并釋放掉.