iT邦幫忙

0

二、三天學一點點 Rust:來! 擁有權Ownership之一(17)

  • 分享至 

  • xImage
  •  

🦀 Rust 擁有權(Ownership)

在 Rust 中,「Ownership(擁有權)」是一組由編譯器檢查的規則,目的是為了防止記憶體錯誤,例如重複釋放、記憶體洩漏等問題。這個系統讓 Rust 能夠在不需要垃圾回收(garbage collection)的情況下,安全且高效地管理記憶體。

🧠 記憶體與程式語言的對比背景

  • 記憶體(Memory):電腦用來暫存程式運行中所需資料的區域。
  • 理想情況是:用完記憶體就釋放,不然會造成記憶體浪費。
  • 不同語言對此有不同策略:
語言策略 說明
手動記憶體管理 像 C / C++,由程式設計師自己負責配置與釋放(容易出錯)
垃圾回收 像 Java、Python、Go,會自動尋找不再使用的資料來釋放(但可能拖慢效能)
擁有權系統 Rust 的做法:由編譯器檢查規則,在編譯階段就防止錯誤

🧾 Rust 的擁有權規則(Ownership Rules)

  • 每個值在程式中都有一個「擁有者」(owner)
  • 一個值在同一時間只能有一個擁有者
  • 當擁有者離開作用域,值就會被自動釋放
    這些規則由 Rust 的 編譯器負責檢查,如果違反,就無法編譯。至於其它細節,在後續以程式碼說明,不過在此之前還需要理解什麼是Stack、Heap,還有變數的作用域等需要先了解。

📚 Rust:The Stack 與 The Heap 概念

在電腦的記憶體中,Stack(堆疊)Heap(堆積) 是兩個不同的區域,它們負責儲存資料的方式不同,各有優缺點。

🧱 The Stack(堆疊)

  • Stack 是一種依照「接收順序」儲存資料的記憶體區塊,採用 後進先出(LIFO) 原則。
  • 最後放進來的資料會是最先被移除的。
  • 放入資料稱為「push」,移除資料稱為「pop」。
  • Stack 上的資料都具有固定大小,且在 編譯時期就已知,如:
    • 整數(i32)、浮點數(f64)、布林值(bool)、字元(char)、陣列等。
  • Stack 上的資料在執行期間不會變大或縮小,因此讀取速度非常快。

🗃 The Heap(堆積)

  • Heap 是一塊較大的儲存空間,可以想像成「倉庫」。
  • 它用來儲存大小在編譯時無法預知的資料,例如:
    • 使用者輸入、檔案內容、可變字串(String)、向量(Vec)等。
  • 當程式需要儲存這些資料時,會透過 記憶體配置器(memory allocator) 向 Heap 申請空間。
  • 記憶體配置器會回傳一個參照(reference),也就是一段記憶體位址。
  • 這個參照可以想像成「停車場給你的位置票:H25」,而資料就停在那個位子上。
  • 參照本身有固定大小,所以會被儲存在 Stack 上,而資料本體則在 Heap 上。

以下就效能差異與存取方式用表格說明:

比較項目 Stack Heap
資料大小 固定大小 可變大小
配置速度 快(直接儲存) 慢(需配置器搜尋空間)
存取方式 直接存取(快) 間接透過指標(稍慢)
應用場景 原始型別、靜態大小資料 動態大小資料、需長期儲存的資料

Rust 的 Ownership 與 Stack / Heap

Rust 的 所有權(Ownership)系統存在的目的之一就是要:

  • 確保 Heap 上的資料「有人負責清理」
  • 防止重複釋放(double free)或記憶體洩漏
  • 透過編譯器幫助管理 Heap 資料的生命週期

🧾 Rust:變數的作用域與自動釋放(Scope & Drop)

在 Rust 中,變數的作用域(Scope)決定了變數何時有效。當變數進入作用域時,它就可以被使用;當變數離開作用域時,它就不再有效。 作用域主要與程式碼中的花括號 {} 相關聯,例如函式或 if 區塊。當變數離開作用域時,Rust 就會自動釋放資源,這稱為 drop(釋放)。案例如下:

fn main() {
    {
        let x = 5;
        println!("{}", x); // ✅ 有效,x 在這個區塊內
    }

    println!("{}", x); // ❌ 錯誤!x 已經離開作用域,被釋放(drop)
}

因此第二個println!會出現以下錯誤:

error[E0425]: cannot find value `x` in this scope
  --> src\main.rs:14:20
   |
14 |     println!("{}", x);
   |                    ^ not found in this scope

For more information about this error, try `rustc --explain E0425`.
error: could not compile `ownership` (bin "ownership") due to 1 previous error

圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言