C语言中调用返回const char*的库函数会造成内存泄漏吗?
json-c 字符串返回值内存管理问题解答
1. 返回值内存的释放时机
你调用的json_object_to_json_string返回的const char*内存,由你传入的json_object对象(也就是你代码里的json变量)内部持有和管理,不需要你手动调用free释放。这块内存会在该json_object对象被销毁时,和对象的其他内存一起被自动回收。
你当前代码中不手动释放string的写法是符合json-c的设计规范的,不需要额外加free(string)操作。
2. 是否会出现内存永不释放的情况
只要你正常对使用完的json_object调用json_object_put减少引用计数,当引用计数降到0触发对象销毁时,对应的字符串内存一定会被释放,不会出现内存泄漏。
只有两种特殊场景会导致这块内存泄漏:
- 你没有对
json对象调用json_object_put释放,整个json_object本身发生泄漏,它持有的字符串内存自然也不会被回收 - 你调用的是带
JSON_C_TO_STRING_NOWEAK标志的json_object_to_json_string_ext扩展函数,这类函数返回的字符串是单独分配的独立内存,需要你手动free,忘记释放就会发生泄漏
3. 返回值的合法访问范围
只要对应的json_object对象还未被销毁(也就是你还没有最后一次调用json_object_put把它的引用计数降到0),你都可以合法访问这个字符串内容:
- 如果你的
myfunc执行结束后没有释放json对象,那即使跳出myfunc作用域也可以正常访问该字符串 - 如果
myfunc结束前就调用了json_object_put释放了json对象,那string指针就会变成野指针,不能再访问
注意:如果你后续修改了
json_object的内容,之前拿到的序列化字符串不会自动更新,需要重新调用json_object_to_json_string获取最新的结果。
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

