json-tutorial icon indicating copy to clipboard operation
json-tutorial copied to clipboard

[tutorial08] 内存泄漏与 lept_copy 失败

Open Ionizing opened this issue 6 years ago • 2 comments

首先感谢 Milo 先生的精彩教程,我在读过之后受益匪浅,并正在做 tutorial08 中留下的练习,我在练习时出现了两个问题无法独立解决,于是寻求您和其他 Watcher 的帮助,现将问题症状描述如下:

  1. 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.clept_copy()LEPT_ARRAY 复制行为的相关代码中,直接原因是 dst->u.a.esrc->u.a.e 的地址相等(对,你没有看错,在不同次的 malloc 之后两个变量对应的地址相等 !); 同样在 Mac 下,如果在编译参数中加上 fsanitize=address 则不会出现这个问题; 在 Linux 下,无论是否使用 asan 都不会出现这个问题,绞尽脑汁后也想不到哪里出现了问题,此为第一个问题;

  1. 程序存在内存泄漏 (6 bytes) 。经过 valgrind 检查,问题出现在 test_access_array()#if 1 ... #endif block 之后的 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 中指出。 深夜打扰各位,再次感到抱歉。

Ionizing avatar Jul 28 '19 16:07 Ionizing

解决了嘛

sukai-cheng avatar Dec 25 '21 17:12 sukai-cheng

我也遇到第一个问题

luobin1s avatar May 27 '22 04:05 luobin1s