跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Rust所有权转移
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{DISPLAYTITLE:Rust所有权转移}} {{编程概念导航}} == 引言 == '''所有权转移'''是Rust所有权系统的核心机制之一,它确保了内存安全而无须垃圾回收。当变量绑定到新值时,原有值的所有权可能被转移(Move),而非复制(Copy)。这一机制避免了悬垂指针和数据竞争,是Rust高效且安全的关键设计。 == 基本概念 == 在Rust中,每个值有且只有一个所有者。当值被赋给另一个变量、作为函数参数传递或从函数返回时,所有权可能发生转移。转移后,原变量将无法继续使用该值(编译器会报错)。 === 所有权转移的触发条件 === * 赋值操作(非`Copy`类型) * 函数传参 * 函数返回值 == 代码示例 == === 示例1:基本所有权转移 === <syntaxhighlight lang="rust"> fn main() { let s1 = String::from("hello"); let s2 = s1; // 所有权从s1转移到s2 // println!("{}", s1); // 编译错误!s1已失效 println!("{}", s2); // 正确:s2拥有数据 } </syntaxhighlight> '''输出''': <pre> hello </pre> '''解释''': * `String`类型未实现`Copy` trait,赋值操作导致所有权转移。 * 尝试使用`s1`会触发编译器错误:`borrow of moved value: 's1'`。 === 示例2:函数中的所有权转移 === <syntaxhighlight lang="rust"> fn take_ownership(s: String) { println!("函数内: {}", s); } // s离开作用域,内存被释放 fn main() { let s = String::from("world"); take_ownership(s); // 所有权转移到函数 // println!("{}", s); // 编译错误! } </syntaxhighlight> '''输出''': <pre> 函数内: world </pre> == 深度解析 == === 所有权转移与栈/堆内存 === * '''栈上数据'''(如`i32`)默认实现`Copy` trait,赋值时复制而非转移。 * '''堆上数据'''(如`String`、`Vec`)通常发生所有权转移。 === 编译器行为 === Rust编译器在编译期静态分析所有权流动,确保: 1. 每个值始终有且只有一个所有者。 2. 值离开作用域时自动调用`drop`释放内存。 <mermaid> flowchart LR A[变量s1创建] --> B[所有权转移到s2] B --> C[s1变为无效] C --> D[仅s2可访问] </mermaid> == 实际应用场景 == === 场景1:避免重复释放 === 所有权转移防止了以下C/C++常见错误: <syntaxhighlight lang="c"> // C语言示例(危险!) char* s1 = malloc(10); char* s2 = s1; free(s1); free(s2); // 双重释放! </syntaxhighlight> Rust通过所有权转移确保内存仅被释放一次。 === 场景2:高效数据传递 === 在迭代器或闭包中,所有权转移允许零成本抽象: <syntaxhighlight lang="rust"> let nums = vec![1, 2, 3]; let sum: i32 = nums.into_iter().sum(); // nums所有权转移 // nums不能再使用 </syntaxhighlight> == 高级主题 == === 显式克隆 === 需复制数据时使用`.clone()`: <syntaxhighlight lang="rust"> let s1 = String::from("clone"); let s2 = s1.clone(); // 深拷贝 println!("{}, {}", s1, s2); // 两者均有效 </syntaxhighlight> === 所有权与函数返回值 === 函数可通过返回值转移所有权: <syntaxhighlight lang="rust"> fn create() -> String { String::from("new") } let s = create(); // 所有权转移到调用者 </syntaxhighlight> == 数学表达 == 所有权转移可形式化为: <math> \forall x \in \text{Value}, \exists! y \in \text{Binding} \mid y \text{ owns } x </math> (对于任意值x,存在唯一绑定y拥有x的所有权) == 总结 == * 所有权转移是Rust独有的内存管理机制。 * 转移后原变量失效,避免悬垂指针。 * 适用于堆分配数据,栈数据通常复制。 * 编译器强制检查,保证安全性。 {{Rust学习路径结构导航}} [[Category:编程语言]] [[Category:Rust]] [[Category:Rust所有权系统]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:Rust学习路径结构导航
(
编辑
)
模板:编程概念导航
(
编辑
)