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
相关产品推荐
相关产品推荐

