标签:rust 编程语言 内存 指针
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被释放的时候,堆上的最后一块内存也被清理了.
Rust中文翻译14
标签:rust 编程语言 内存 指针
原文地址:http://blog.csdn.net/zcmit/article/details/46797551