00. Rust 內存管理

一般咱們都曉得像 C/Cpp 這類語言, 須要手動管理內存, 可是一樣地也很容易出現內存管理不當引起的問題, 譬如空指針, 野指針之類的東西. 而後就發展出了帶 Garbage Collection(垃圾回收) 的語言. 可是 GC 這個玩意最明顯的地方就是運行時佔用內存比較大, 還有就是回收的時候會停頓. 要是應用對性能敏感的話, 還停頓一下, 有點要命. 或者應用是跑在小內存設備上的.安全

如今咱們要是有一門語言, 又不須要 GC, 還能保證內存安全, 那就讚了. 恰好 Rust 符合要求.bash

應該是一個系列的吧

00. Rust 內存管理
01. Rust 內存管理 Ownership & Move
02. Rust 內存管理 Copy & Clone(上)
03. Rust 內存管理 Copy & Clone(下)post

常見的內存錯誤

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是一個可讀可執行區域, 可是這段代碼想給這個區域寫數據, 等於講沒有這方面的權限, 最明顯的反應就是進程非正常退出了.ui

$ 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 faultspa

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 設計出來就是爲了從語言層面解決內存問題.指針


又開坑了, 處處挖坑.code

相關文章
相關標籤/搜索