运行时刻环境
来源:龙书(厚),南大课后作业
p283 7.2.4
Answer
我们不妨将 g 的调用者称为 h,并给各个空间标号。
-
h 创建了 0~ 2 号空间,g 创建了 3~6 号空间,f 创建了 7 号空间。
-
h 写入了 y 和指向 h 的控制链的值;g 写入了 j, x 和指向 g 的控制链的值;f 写入了 i 和 f 的返回值。
-
如图所示,0~ 3 号空间属于 g 的活动记录,4~7 号空间属于 f 的活动记录。
知识点
- 活动树、栈分配、活动记录、调用/返回代码序列
p303 7.5.1
当下列聿件发生时,图7-19中的对象的引用计数会发生哪些改变?
- 从A指向B的指针被删除。
- 从X指向A的指针被册除。
- 结点C被删除。
Answer
-
从A指向B的指针被删除
-
从X指向A的指针被删除
-
结点C被删除
知识点
p303 7.5.2
当图7-20中的从A到D的指针被删除时,引用计数会发生什么样的改变?
Answer
A->D被清除后,D, F, G 均无法被访问到,D->G, D->H, D->F, G->H, F->I 的指针均被清除。引用计数变化如下:
知识点
p311 7.6.1
Answer
before: A.reached = … = I.reached = 0
Unscanned = []
line1: A.reached = 1
Unscanned.push(A)
line2~7:
loop1: Unscanned.shift()
C.reached = 1
Unscanned.push( C )
loop2: Unscanned.shift()
F.reached = 1
Uncanned.push(F)
loop3: Unscanned.shift()
H.reached = 1
Uncanned.push(H)
loop4: Unscanned.shift()
I.reached = 1
Uncanned.push(I)
loop5: Unscanned.shift()
G.reached = 1
Uncanned.push(G)
loop6: Unscanned.shift()
E.reached = 1
Uncanned.push(E)
loop7: Unscanned.shift()
// no more object add to list Unscanned
// now it is empty, loop end
line8: Free = []
line9~11: Free = [B, D]
A.reached = C.reached = E.reached = … = I.reached = 0