json-tutorial
json-tutorial copied to clipboard
[tutorial08] 内存泄漏与 lept_copy 失败
首先感谢 Milo 先生的精彩教程,我在读过之后受益匪浅,并正在做 tutorial08 中留下的练习,我在练习时出现了两个问题无法独立解决,于是寻求您和其他 Watcher 的帮助,现将问题症状描述如下:
- 在
test_copy()中lept_copy(&v2, &v1)(line 479) 这一行,如果是在 Mac 下直接使用 Milo 先生给出的编译参数则会出现
Assertion failed: (src != NULL && dst != NULL && src != dst), function lept_copy, file /Users/ionizing/Documents/github/json-tutorial/draft/tutorial08_answer/leptjson.c, line 420.
经过断点测试,发现问题出在 leptjson.c 的 lept_copy() 对 LEPT_ARRAY 复制行为的相关代码中,直接原因是 dst->u.a.e 与 src->u.a.e 的地址相等(对,你没有看错,在不同次的 malloc 之后两个变量对应的地址相等 !);
同样在 Mac 下,如果在编译参数中加上 fsanitize=address 则不会出现这个问题;
在 Linux 下,无论是否使用 asan 都不会出现这个问题,绞尽脑汁后也想不到哪里出现了问题,此为第一个问题;
- 程序存在内存泄漏 (6 bytes) 。经过
valgrind检查,问题出现在test_access_array()的#if 1 ... #endifblock 之后的lept_set_string(&e, "Hello", 5)(line 614) 中, valgrind 认为lept_set_string()的实现中v->u.s.s = (char*)malloc(len + 1);会导致v->u.s.s原来所指内存泄漏,这个问题在 Mac 和 Linux 都可以稳定复现。
我的解答代码: 这里,直接搜索 todo 可以定位到我的修改处。
我的系统环境:
Mac: macOS 10.13.6, clang version 8.0.0 (tags/RELEASE_800/final by homebrew)
Linux: ArchLinux, gcc version 9.1.0 (by pacman)
如果还需要其他信息,还请各位在 reply 中指出。 深夜打扰各位,再次感到抱歉。
解决了嘛
我也遇到第一个问题