Skip to content

Commit a991476

Browse files
committed
Merge branch 'master' into draft
2 parents 54cb6fd + ff17106 commit a991476

File tree

2 files changed

+5
-5
lines changed

2 files changed

+5
-5
lines changed

readme.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,4 +50,4 @@
5050

5151
## 关于作者
5252

53-
叶劲峰(Milo Yip)现任腾讯 T4 专家、互动娱乐事业群魔方工作室群前台技术总监。他获得香港大学认知科学学士(BCogSc)、香港中文大学系统工程及工程管理哲学硕士(MPhil)。他是《游戏引擎架构》译者、《C++ Primer 中文版(第五版)》审校。他曾参与《天涯明月刀》、《斗战神》、《爱丽丝:疯狂回归》、《美食从天降》、《王子传奇》等游戏项目,以及多个游戏引擎及中间件的研发。他是开源项目 [RapidJSON](https://github.com/miloyip/rapidjson) 的作者,开发 [nativejson-benchmarck](https://github.com/miloyip/nativejson-benchmark) 比较 41 个开源原生 JSON 库的标准符合程度及性能。他在 1990 年学习 C 语言,1995 年开始使用 C++ 于各种项目。
53+
叶劲峰(Milo Yip)现任腾讯 T4 专家、互动娱乐事业群魔方工作室群前台技术总监。他获得香港大学认知科学学士(BCogSc)、香港中文大学系统工程及工程管理哲学硕士(MPhil)。他是《游戏引擎架构》译者、《C++ Primer 中文版(第五版)》审校。他曾参与《天涯明月刀》、《斗战神》、《爱丽丝:疯狂回归》、《美食从天降》、《王子传奇》等游戏项目,以及多个游戏引擎及中间件的研发。他是开源项目 [RapidJSON](https://github.com/miloyip/rapidjson) 的作者,开发 [nativejson-benchmark](https://github.com/miloyip/nativejson-benchmark) 比较 41 个开源原生 JSON 库的标准符合程度及性能。他在 1990 年学习 C 语言,1995 年开始使用 C++ 于各种项目。

tutorial05/tutorial05.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ JSON 数组存储零至多个元素,最简单就是使用 C 语言的数组。
3535

3636
我见过一些 JSON 库选择了链表,而这里则选择了数组。我们将会通过之前在解析字符串时实现的堆栈,来解决解析 JSON 数组时未知数组大小的问题。
3737

38-
决定之后,我们在 `kept_value``union` 中加入数组的结构:
38+
决定之后,我们在 `lept_value``union` 中加入数组的结构:
3939

4040
~~~c
4141
typedef struct lept_value lept_value;
@@ -89,7 +89,7 @@ static void test_parse_array() {
8989
}
9090
~~~
9191

92-
在之前的单元中,作者已多次重申,C 语言的数组大小应该使用 `size_t` 类型。因为我们要验证 `lept_get_array_size()` 返回值是否正确,所以再为单元测试框架添加一个宏 `EXPECT_EQ_SIZE_T`。麻烦之处在于,ANSI C(C99)并没有的 `size_t` 打印方法,在 C99 则加入了 `"%zu"`,但 VS2015 中才有,之前的 VC 版本使用非标准的 `"%Iu"`。因此,上面的代码使用条件编译去区分 VC 和其他编译器。虽然这部分不跨平台也不是 ANSI C 标准,但它只在测试程序中,不太影响程序库的跨平台性。
92+
在之前的单元中,作者已多次重申,C 语言的数组大小应该使用 `size_t` 类型。因为我们要验证 `lept_get_array_size()` 返回值是否正确,所以再为单元测试框架添加一个宏 `EXPECT_EQ_SIZE_T`。麻烦之处在于,ANSI C(C89)并没有的 `size_t` 打印方法,在 C99 则加入了 `"%zu"`,但 VS2015 中才有,之前的 VC 版本使用非标准的 `"%Iu"`。因此,上面的代码使用条件编译去区分 VC 和其他编译器。虽然这部分不跨平台也不是 ANSI C 标准,但它只在测试程序中,不太影响程序库的跨平台性。
9393

9494
## 3. 解析过程
9595

@@ -99,7 +99,7 @@ static void test_parse_array() {
9999

100100
但和字符串有点不一样,如果把 JSON 当作一棵树的数据结构,JSON 字符串是叶节点,而 JSON 数组是中间节点。在叶节点的解析函数中,我们怎样使用那个堆栈也可以,只要最后还原就好了。但对于数组这样的中间节点,共用这个堆栈没问题么?
101101

102-
答案是:只要在解析函数结束时还原堆栈的状庇,就没有问题。为了直观地了解这个解析过程,我们用连环图去展示 `["abc",[1,2],3]` 的解析过程。
102+
答案是:只要在解析函数结束时还原堆栈的状态,就没有问题。为了直观地了解这个解析过程,我们用连环图去展示 `["abc",[1,2],3]` 的解析过程。
103103

104104
首先,我们遇到 `[`,进入 `lept_parse_array()`
105105

@@ -220,7 +220,7 @@ static int lept_parse_value(lept_context* c, lept_value* v) {
220220

221221
2. 现时的测试结果应该是失败的,因为 `lept_parse_array()` 里没有处理空白字符,加进合适的 `lept_parse_whitespace()` 令测试通过。
222222

223-
3. 使用第四单元介绍的检测内存泄漏工具,会发现测试中有内存泄漏。很明显在 `lept_parse_array()` 中使用到 `malloc()` 分配内存,但却没有对应的 `free()`。应该在哪里释放内存?修改代码,使工具不再检测到相关的内存泄漏。
223+
3. 使用[第三单元解答篇](../tutorial03_answer/tutorial03_answer.md)介绍的检测内存泄漏工具,会发现测试中有内存泄漏。很明显在 `lept_parse_array()` 中使用到 `malloc()` 分配内存,但却没有对应的 `free()`。应该在哪里释放内存?修改代码,使工具不再检测到相关的内存泄漏。
224224

225225
4. 开启 test.c 中两处被 `#if 0 ... #endif` 关闭的测试,本来 `test_parse_array()` 已经能处理这些测试。然而,运行时会发现 `Assertion failed: (c.top == 0)` 断言失败。这是由于,当错误发生时,仍然有一些临时值在堆栈里,既没有放进数组,也没有被释放。修改 `test_parse_array()`,当遇到错误时,从堆栈中弹出并释放那些临时值,然后才返回错误码。
226226

0 commit comments

Comments
 (0)