所有权

11 阅读2分钟

概述

  • 所有权是 Rust 最核心的内存管理机制。
  • 与垃圾回收(GC)和手动内存管理不同,Rust 在编译时通过所有权规则确保内存安全。

内存管理

  • 程序必须安全有效地管理内存,包括申请和释放空间。

所有权规则

  1. 每个值都有一个所有者。
  2. 一个值在任意时间点只能有一个所有者。
  3. 当所有者超出作用域时,值将被丢弃。

栈与堆

  • :后进先出的数据结构,存储固定大小的数据,分配和回收速度快。
  • :灵活的内存分配,存储大小可变的数据,分配和回收速度慢。

变量作用域

  • 作用域定义了变量的生命周期。

String 类型

  • String 是动态字符串类型,存储在堆上,可动态扩展。

转移所有权

  • 将一个值从一个变量转移到另一个变量时,所有权发生转移。

转移所有权示例

let s1 = String::from("hello");
let s2 = s1; // s1 的值移动到 s2,s1 不再有效

克隆(深拷贝)

  • 使用 clone 方法可以创建堆上数据的深拷贝。

克隆示例

let s1 = String::from("hello");
let s2 = s1.clone(); // 创建 s1 的深拷贝

拷贝(浅拷贝)

  • 基本类型通过值拷贝赋值,存储在栈上。

拷贝示例

let x = 5;
let y = x; // x 的值被拷贝到 y,x 仍然有效

函数传值与返回

  • 函数参数传递和返回值也会涉及所有权的转移或复制。

函数传值示例

fn takes_ownership(some_string: String) {
    println!("{}", some_string);
} // some_string 离开作用域并被丢弃

fn makes_copy(some_integer: i32) {
    println!("{}", some_integer);
} // some_integer 离开作用域,没有特殊操作

函数返回值

  • 函数返回值也有所有权,可以被移动或复制。

函数返回值示例

fn gives_ownership() -> String {
    let some_string = String::from("hello");
    some_string // 返回值移动给调用者
}

fn takes_and_gives_back(a_string: String) -> String {
    a_string // 返回传入的字符串
}

总结

  • 所有权是 Rust 确保内存安全的核心机制。
  • 理解栈和堆对掌握所有权至关重要。
  • 所有权规则简单明了,但需要实践来加深理解。
  • 通过 clone 方法可以创建深拷贝,但应谨慎使用以避免性能问题。
  • 函数的参数传递和返回值遵循所有权规则。