You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust可变引用传入函数的机制解析:与C++指针的对比困惑

Rust可变引用传递的核心逻辑解析

首先明确C的情况:你说得没错,C中把指针作为参数传值时,确实会拷贝出一个独立的指针副本(也就是函数里的s_ref),这个副本和原指针s指向同一个对象,两者在各自作用域内同时有效,函数结束后副本自动销毁,原指针不受影响。

但Rust的可变引用和C++指针的传参逻辑完全不同,核心原因是:Rust的可变引用(&mut T)不实现Copy trait,它的传递遵循移动语义,而不是拷贝语义。

回到你的代码:

fn func(s_ref: &mut str) {}

fn main() {
    let mut word = "hello".to_string();
    let s: &mut str = &mut word;
    func(s);
}

当你调用func(s)时,并不是把s拷贝一份给s_ref,而是将s的引用使用权完全转移到函数参数s_ref中。此时,main作用域里的s立刻失效——编译器会禁止你在func调用之后再使用s,否则会触发编译错误。

比如尝试在func调用后使用s:

fn func(s_ref: &mut str) {}

fn main() {
    let mut word = "hello".to_string();
    let s: &mut str = &mut word;
    func(s);
    println!("{}", s); // 编译报错:value borrowed here after move
}

这个报错直接证明了s已经被移动,而非拷贝。

这正是Rust保证内存安全的关键:通过移动语义,确保同一时间只有一个可变引用能访问目标对象word,完全符合"同一时间只能有一个可变引用"的借用规则。

内容的提问来源于stack exchange,提问作者Bird

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 06:08:10