00. Rust 内存管理

栏目: 编程语言 · Rust · 发布时间: 5年前

内容简介:通常我们都晓得像 C/Cpp 这类语言, 需要手动管理内存, 但是同样地也很容易出现内存管理不当引发的问题, 譬如空指针, 野指针之类的东西. 然后就发展出了带 Garbage Collection(垃圾回收) 的语言. 但是 GC 这个玩意最明显的地方就是运行时占用内存比较大, 还有就是回收的时候会停顿. 要是应用对性能敏感的话, 还停顿一下, 有点要命. 或者应用是跑在小内存设备上的.现在我们要是有一门语言, 又不需要 GC, 还能保证内存安全, 那就赞了. 刚好 Rust 符合要求.一般的 C/Cp

通常我们都晓得像 C/Cpp 这类语言, 需要手动管理内存, 但是同样地也很容易出现内存管理不当引发的问题, 譬如空指针, 野指针之类的东西. 然后就发展出了带 Garbage Collection(垃圾回收) 的语言. 但是 GC 这个玩意最明显的地方就是运行时占用内存比较大, 还有就是回收的时候会停顿. 要是应用对性能敏感的话, 还停顿一下, 有点要命. 或者应用是跑在小内存设备上的.

现在我们要是有一门语言, 又不需要 GC, 还能保证内存安全, 那就赞了. 刚好 Rust 符合要求.

常见的内存错误

Segmentation fault

一般的 C/Cpp 程序很容易制造内存错误, 譬如这段代码.

#include <stdio.h>
#include <string.h>

int main(int argv, char **argc) {
    char *str = "hello, world";
    strcpy(str, "hello, rust");
    printf("%s\n", str);
    return 0;
}
复制代码

表面上看不出问题, 直接编译也通过了, 但是一执行就 error 了. 如果要揪其原因, 我们先编译之后再通过 objdump 看看.

Section __cstringSegment __TEXT

这里会出现错误是因为 __TEXT 是一个可读可执行区域, 但是这段代码想给这个区域写数据, 等于讲没有这方面的权限, 最明显的反应就是进程非正常退出了.

$ gcc xxx.c -g -Wall
$ objdump -s a.out

Contents of section __cstring:
 100000f90 68656c6c 6f2c2077 6f726c64 0068656c  hello, world.hel
 100000fa0 6c6f2c20 72757374 0025730a 00        lo, rust.%s..
 
$ size -x -l -m a.out
Segment __TEXT: 0x1000 (vmaddr 0x100000000 fileoff 0)
	Section __text: 0x60 (addr 0x100000f00 offset 3840)
	Section __stubs: 0xc (addr 0x100000f60 offset 3936)
	Section __stub_helper: 0x24 (addr 0x100000f6c offset 3948)
	Section __cstring: 0x1d (addr 0x100000f90 offset 3984)
	Section __unwind_info: 0x48 (addr 0x100000fb0 offset 4016)
	total 0xf5
复制代码

解引用空指针

当然我们平常开发不会特意这么写. 虽然编译成功了, 但是执行中会发生 Segmentation fault

int a = 10;
int *p = &a;
p = NULL;
printf("%d\n", *p);
复制代码

悬空指针

我们这里给 p 申请了一块内存空间, 然后给里面写了些值, 判断 p 不是 NULL, 把 p 指向的区域给 free 了, 但是 p 还是指向那块地址, 这时候 p 就是悬空指针了. 最后打印出了 p is not NULL. 假如我们再使用 p 做一些操作, 很可能访问到受保护的内存, 造成 Segmentation fault

#include <stdio.h>
#include <string.h>

int main(int argv, char **argc) {
    char *p = NULL;
    p = (char *)malloc(50);
    strcpy(p, "test");
    if (NULL != p) {
        free(p);
    }
    if (NULL != p) {
        printf("p is not NULL.");
    }
    return 0;
}
复制代码

......

有些问题很多可以通过规范来避免, 但是没法保证每个人遵守规范. 所以 Rust 设计出来就是为了从语言层面解决内存问题.

又开坑了, 到处挖坑.


以上所述就是小编给大家介绍的《00. Rust 内存管理》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

不是为了快乐

不是为了快乐

宗萨蒋扬钦哲仁波切 / 姚仁喜 / 深圳报业集团出版社 / 2013-1 / 38.00元

前行修持是一套完整的实修系统,它既是一切佛法修持的根基,又囊括了所有修持的精华,以及心灵之道上所需的一切;既适合入门者打造学佛基本功,也是修行人需要终生修持的心法。书中除了实际的方法指导之外,还不断启发佛法的珍贵与修持的必要,并处处可见对学佛者的鼓舞和纠正,其最终的用心,是让我们踏上不间断的修持之路,真正转化我们僵硬、散乱和困惑的心。 在现代人看来,快乐,理应是最值得追求的目标。我们希望生活......一起来看看 《不是为了快乐》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

MD5 加密
MD5 加密

MD5 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具