You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

cJSON_Delete()和cJSON_free()区别及内存管理、cJSON_InitHooks()使用咨询

cJSON常见使用问题解答

1. 资源释放相关函数的区分与适用场景

cJSON的头文件cJSON.h中对所有接口的内存管理规则都有明确注释,是最准确的参考依据:

  • cJSON_Delete():用于释放完整的cJSON节点树。所有通过cJSON_Parse()解析得到的根节点、通过cJSON_CreateObject()/cJSON_CreateArray()/cJSON_CreateString()等创建类接口生成的独立节点,用完都需要调用该接口释放,它会递归释放当前节点、所有子节点以及节点存储字符串值的内存,避免内存泄漏。
  • cJSON_free():用于释放单个独立内存块。仅在两种场景下使用:一是你主动调用cJSON_malloc()分配的内存;二是调用cJSON_Print()/cJSON_PrintUnformatted()等返回字符串指针的接口后,返回的字符串用完需要用cJSON_free()释放。
    注意不要混用两个接口:不要用cJSON_Delete()释放打印返回的字符串,也不要用cJSON_free()直接释放cJSON节点指针,否则会出现内存泄漏或者野指针崩溃。

2. cJSON_InitHooks()的作用与使用方法

  • 作用:cJSON默认使用标准库的malloc和free进行内存管理,cJSON_InitHooks()用于自定义替换cJSON默认的内存分配、释放逻辑。常用于需要接入项目自定义内存池、做内存泄漏统计、嵌入式环境下适配专属内存分配接口的场景。
  • 使用方法:该函数必须在所有cJSON相关操作之前调用,使用示例如下:
// 自定义内存分配函数,可替换为项目自身的内存分配逻辑
void* custom_malloc(size_t size) {
    return my_pool_alloc(size);
}
// 自定义内存释放函数
void custom_free(void* ptr) {
    my_pool_free(ptr);
}

// 初始化配置结构体
const cJSON_Hooks my_hooks = {
    .malloc_fn = custom_malloc,
    .free_fn = custom_free
};
// 替换默认内存接口
cJSON_InitHooks(&my_hooks);

3. cJSON类型指针的内存释放规则

cJSON没有自动垃圾回收机制,所有分配的内存都需要手动释放,具体遵循以下规则:

  • 仅声明cJSON *Variable;指针不会分配内存,不需要释放。
  • 如果指针接收的是cJSON_Parse()或者cJSON_CreateXXX()类接口返回的根节点,使用完成后必须调用cJSON_Delete()释放整个节点树。
  • 如果指针是通过cJSON_GetObjectItem()/cJSON_GetArrayItem()等查询接口拿到的子节点指针,不需要单独释放,该节点内存会在根节点调用cJSON_Delete()时被递归释放,单独释放子节点会导致后续根节点释放时出现重复释放崩溃。

内容的提问来源于stack exchange,提问作者FaruK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 05:54:00