01. Rust 內存管理 Ownership & Move

關於全部權

一般在 C/Cpp 中, 假設咱們用一個指針指向一塊申請的內存區域函數

char *p = (char *) malloc(50);
複製代碼

假設這個 p 攜帶了數據, 恰好有個函數須要使用到 p 攜帶的數據, 那麼就像這樣ui

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

void foo(char *p) {
    *p = NULL;
}

int main(int argc, char **argv) {
    char *p = (char *) malloc(50);
    strcpy(p, "test");
    printf("%s\n", p);
    foo(p);
    printf("%s\n", p);
    return 0;
}
複製代碼

foo 你不看函數實現根本不曉得內部會作什麼事, 是否進行了 free 操做等等. 就像這裏, 函數內部把指針設成 NULL, 你外部也不曉得.
Rust 經過引入一個 ownership 的概念來解決此類問題.spa

Ownership

咱們能夠定義一個變量來理解.指針

let a = String::from("test");
複製代碼

通常咱們都會講給變量 a 賦一個 String 類型的值, 可是 Rust 裏的說法是, 給 a 綁定一個 String 類型的值, 爲何要這麼講嘞.
首先綁定就是當前狀況下, String 類型的這個值, 只有 a 這一個管理者, 因此 a 就是值的全部者, a 離開當前的做用域, a 就被處理掉, 包括它所管理的值. 這就是 ownership 的概念.code

Move

而後就是 move, 這個概念很好理解, 就是變量的 ownership 轉移的行爲. 咱們的變量 a 如今擁有了它的值的全部權, 要是綁定的時候再加個 mut, 還能改變值. 我要是再把它綁定給其餘的變量, 天然也是能夠的, 可是同時得把關於這個值的 ownership 交出來.ip

let mut a = String::from("test");
a = String::from("foo");
a.push_str("bar");
println!("{}", a);
let b = a;
複製代碼

如今, 咱們的 a 已經無法用了, 也就是 aownership 已經 moveb 了. 有一點要搞清爽的就是, 起初 aString 類型值的全部者, 可是當權力變動的時候, a 就沒了, 而 String 類型的值直接轉交給了 b.內存

Move 在不少地方發生
fn main() {
    let a = foo();
    bar(a);
}
fn bar(s: String) {
    println!("{}", s);
}

fn foo() -> String {
    let a = String::from("bar");
    a
}
複製代碼

這些函數傳參, 返回值都會發生 move.作用域


好吧, 此次我不會管挖無論埋了, 好好寫完這一系列.string

相關文章
相關標籤/搜索