如何在Rust中通过指针返回字符串且不违反生命周期规则?
解决Rust中通过C风格输出参数传递String的所有权问题
你的核心问题是需要将函数内创建的String所有权转移给调用者,同时遵循Rust的生命周期规则。直接引用局部变量会导致悬垂指针,正确的做法是通过双重可变引用的解引用操作,把新创建的String所有权转移到调用者持有的实例中。
正确实现代码
pub extern fn get_string(file: &mut &mut String) -> i32 { // 创建拥有所有权的新String let my_str = "String passed in Rust.\n".to_owned(); // 将my_str的所有权转移给调用者的String实例 **file = my_str; 0 // 返回状态码 }
原理说明
**file是对双重可变引用的两次解引用:第一次解引用得到&mut String,第二次解引用直接指向调用者侧的String实例本身。- 赋值操作
**file = my_str会将局部变量my_str的所有权完全转移给调用者的String,函数结束后my_str的内存不会被销毁,因为所有权已经移交。 - 这种方式完全符合Rust的所有权规则,既避免了悬垂引用,又满足了你必须通过指针参数传递的要求。
如果调用者侧原本的String有内容,赋值操作会自动drop旧内容并替换为新的String,这是符合预期的行为。
内容的提问来源于stack exchange,提问作者user2506946
相关产品推荐
相关产品推荐

