Json­-C用法释疑

实际项目中发现Json-C用法不当导致的内存泄露、踩内存问题,大都是因为不清楚下面几个接口的用法。

以下分析基于https://github.com/json-c/json-c( 0.12.1 release)。

1. json_object_new_object生成的对象要不要释放

上面的代码执行后,你会发现泄漏下面这些内存:

所以,json_object_new_object生成的对象必须调用json_object_put释放

2. json_tokener_parse生成的对象要不要释放

上面这些代码执行后,你会发现下面这些 内存泄漏:

所以,json_tokener_parse生成的对象,必须使用json_object_put释放.

3. json_object_object_get出来的对象要不要释放

借助内存越界检测工具efence和gdb,运行代码发现段错误,其中test.c:22指向json_object_put(obj)这一行.

这是因为child节点被释放过了,现在又去释放, 使用了野指针(不借助工具,程序会正常结束,这也是这种错误的可怕之处)。

这种不会立即终止程序的错误太可怕 ,让你都不知道怎么死的。

所以,通过json_object_object_get获取的对象不能单独释放,因为它仍然归父节点所有。

4. 通过json_object_object_add添加到其他节点的,能不能释放

这个运行后,产生的错误和3中类似,也是因为重复释放。

所以,通过json_object_object_add添加到其他节点的不能再单独释放,因为他已经成为别人的子节点,他的生命周期由父节点维护了。

5. json_object_to_json_string获取到的字串要不要释放

这个free也是非法的,因为json_object_to_json_string只是把json对象内部的指针暴露给你了,借你用下而已,千万别释放。

6. Other

上面这几点疑惑,通过API接口描述文档都可以消除掉,再不济看看作者的Demo、源码也可以消除掉。

所以,大家使用开源软件时,一定要搞明白再用,否则会带来很多问题。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180701G00HP200?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券