blog.dopana

Back

Bài thứ năm trong loạt Rust cơ bản. Ownership là ý tưởng đặc trưng nhất của Rust và là lý do nó an toàn bộ nhớ mà không cần garbage collector.

Các quy tắc#

  1. Mỗi giá trị trong Rust có một owner.
  2. Chỉ có thể có một owner tại một thời điểm.
  3. Khi owner ra khỏi phạm vi, giá trị bị hủy.
fn main() {
    let s = String::from("hello");
    println!("{s}");
}   // s ra khỏi phạm vi; bộ nhớ được giải phóng
rust

Ngữ nghĩa move#

Gán giá trị cho biến khác sẽ di chuyển quyền sở hữu — biến cũ không dùng được nữa:

let s1 = String::from("hello");
let s2 = s1;
// println!("{s1}");   // lỗi: giá trị đã bị di chuyển
println!("{s2}");      // ok
rust

Chuỗi không bị sao chép; dữ liệu và quyền sở hữu chuyển sang s2. Đây là lý do Rust không có lỗi dùng-sau-khi-giải-phóng.

Kiểu Copy#

Kiểu nhỏ có chi phí sao chép rẻ sẽ được sao chép, không bị move. Chúng implement trait Copy:

let a = 5;
let b = a;      // a vẫn dùng được
rust

Số nguyên, số thực, boolean và charCopy. StringVec thì không.

Clone#

Để sao chép giá trị cấp phát trên heap, gọi .clone() một cách tường minh:

let s1 = String::from("hello");
let s2 = s1.clone();
println!("{s1} {s2}");   // cả hai đều hợp lệ
rust

clone tạo bản sao sâu. Lời gọi tường minh làm lộ rõ chi phí.

Ownership và hàm#

Truyền giá trị vào hàm sẽ move nó; trả về sẽ move nó trở lại:

fn take_and_return(s: String) -> String {
    s
}

fn main() {
    let s = String::from("hi");
    let s = take_and_return(s);   // move vào, rồi move ra
}
rust

Ownership và phạm vi#

Giá trị bị hủy khi phạm vi của owner kết thúc. Dọn dẹp theo phạm vi nghĩa là tài nguyên — không chỉ bộ nhớ — được giải phóng tự động.

Vì sao quan trọng#

Ownership cho phép trình biên dịch chứng minh không có use-after-free, double-free, và con trỏ treo — những lỗi ám ảnh C và C++. Bạn viết code bình thường và trình biên dịch thực thi sự an toàn.

Kết luận#

Ownership: mỗi giá trị một owner, mặc định move, sao chép cho kiểu Copy, clone tường minh cho bản sao sâu. Bài tiếp theo trong loạt: tham chiếu và slice.

Tài liệu tham khảo#