< 返回版块

TD-Sky 发表于 2021-06-05 21:41

Tags:ownership, 生命周期

如果我在某个函数里构造了一个对象并返回,但在调用函数中不使用变量接受它,那该对象的堆是被立即释放还是泄漏了?程序编译通过了。

( 电脑不在手边,各位朋友凑合着看吧,对不起(T_T) )

评论区

写评论
eweca-d 2021-06-06 11:10

不用怀疑,其实直接构筑例子是很容易的,如下:

fn main() {
    let s = "Hello, world!".to_string().as_str();
    println!("{}", s);
}

这个代码是无法通过编译的,提示如下:

error[E0716]: temporary value dropped while borrowed
 --> src\main.rs:2:13
  |
2 |     let s = "Hello, world!".to_string().as_str();
  |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^         - temporary value is freed at the end of this statement
  |             |
  |             creates a temporary which is freed while still in use
3 |     println!("{}", s);
  |                    - borrow later used here
  |
  = note: consider using a `let` binding to create a longer lived value

在这里,to_string()函数返回的是String,它没有被绑定到任何变量上,然后却直接被函数as_str()使用。注意,这里as_str()接收的是一个&String,所以按道理String没有被消耗掉。之后生成的是&str,最后&str被绑定到变量s上。显然语句结束后,String被释放了,从而导致&str这个引用指向为一个被释放的内存,所以编译器发生错误。

注意的是:as_str()不会消耗String;编译器提示,临时变量是在声明结束的时候被释放的。

就是像他所说的,会创建一个临时变量,然后该行语句结束直接被释放掉。

--
👇
TD-Sky: 谢谢回答!权威指南里有说吗?我当前读的章节找不到。

--
👇
viruscamp: 调用函数会有一个临时变量拥有返回的值, 语句结束后 drop 此临时变量

viruscamp 2021-06-05 22:31

看权威指南(The Book)就不要钻牛角尖。要相信 rust 不会在这么常见且简单的情况下出错。

要当语言律师至少要看 The Reference

https://doc.rust-lang.org/stable/reference/expressions.html#temporaries 这一章

  1. 函数调用是 expression
  2. 最差的情况下 expression 的值也会由 Temporary 临时变量保存
  3. 临时变量何时 drop Temporary scopes
作者 TD-Sky 2021-06-05 22:10

谢谢回答!权威指南里有说吗?我当前读的章节找不到。

--
👇
viruscamp: 调用函数会有一个临时变量拥有返回的值, 语句结束后 drop 此临时变量

viruscamp 2021-06-05 21:56

调用函数会有一个临时变量拥有返回的值, 语句结束后 drop 此临时变量

1 共 4 条评论, 1 页