关闭

Rust中文翻译14

标签: rust编程语言内存指针
679人阅读 评论(0) 收藏 举报
分类:
Page 71

我们给j,i,h分配了内存.i在堆上,所以是一个指向堆的指针保存在i里.然后再main()函数的结尾,foo()函数被调用:
地址 名字
230   20
... ... ...
5 z 4
4 y 10
3 x 0
2 j 0
1 i 230
0 h 3
x,y,z都得到了各自的内存.参数x拥有和j一样的值,那是因为我们就是这样传参的.它其实是一个指向0地址的指针,因为j指向的是h.

下面,foo()函数调用了baz(),传递了z:
地址 名字
230   20
... ... ...
7 g 100
6 f 4
5 z 4
4 y 10
3 x 0
2 j 0
1 i 230
0 h 3
我们给f和g分配了内存.baz()函数非常短,所以当他结束的时候,我们释放了它的栈帧:
地址 名字
230   20
... ... ...
7 g 100
6 f 4
5 z 4
4 y 10
3 x 0
2 j 0
1 i 230
0 h 3

Page 72

然后,foo()函数调用了bar()函数,参数是x和z:
地址 名字
230   20
(230)-1   5
... ... ...
10 e 9
9 d (230)-1
8 c 5
7 b 4
6 a 0
5 z 4
4 y 10
3 x 0
2 j 0
1 i 230
0 h 3
我们又在堆上分配了另一个空间,所以我们需要再230减1的地方分配.这要比写作1,073,741,823来的容易理解.在任何时候,我们都像平常一样设置变量的值.

在bar()函数的结尾,它又调用了baz():
地址 名字
230   20
(230)-1   5
... ... ...
12 g 100
11 f 4
10 e 9
9 d (230)-1
8 c 5
7 b 4
6 a 0
5 z 4
4 y 10
3 x 0
2 j 0
1 i 230
0 h 3
在这里,我们达到了最深的栈帧!wow!恭喜你跟随我来到了这么远.
当baz()结束的时候,我们释放了f和g的内存:

Page 73

地址 名字
230   20
(230)-1   5
... ... ...
10 e 9
9 d (230)-1
8 c 5
7 b 4
6 a 0
5 z 4
4 y 10
3 x 0
2 j 0
1 i 230
0 h 3
然后,我们从bar()返回.d是一个Box<T>类型,所以它也释放了它所指向的地址:(230)-1.

地址 名字
230   20
... ... ...
5 z 4
4 y 10
3 x 0
2 j 0
1 i 230
0 h 3

在这之后,foo()函数也返回:

地址 名字
230   20
... ... ...
2 j 0
1 i 230
0 h 3
最后,在main()函数结束以后,所有的内存都被清除.当i被释放的时候,堆上的最后一块内存也被清理了.
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:34949次
    • 积分:715
    • 等级:
    • 排名:千里之外
    • 原创:4篇
    • 转载:0篇
    • 译文:33篇
    • 评论:13条
    文章分类
    最新评论