【发布时间】:2020-07-19 12:17:16
【问题描述】:
我是 Rust 的新手,并试图了解从函数返回对象时如何传递所有权。 在以下基于引用的实现中,由于引用没有所有权,因此当“s”超出范围时,它会被丢弃并释放。
fn dangle() -> &String { // dangle returns a reference to a String
let s = String::from("hello"); // s is a new String
&s // we return a reference to the String, s
} // Here, s goes out of scope, and is dropped. Its memory goes away.
// Danger!
通过不返回引用来解决这个问题:
fn no_dangle() -> String {
let s = String::from("hello");
s
}
现在我试图通过 C++ 实现来理解这一点,如下所示:
std::string no_dangle() {
std::string s("hello world");
return s;
}
据我了解,在 C++ 中,当函数返回“s”时,会使用复制构造函数创建另一个副本,而函数内部创建的“s”会被释放。这意味着,创建了两个对象在内存方面真的很光学。
我的问题:
-
在Rust中,当函数返回“s”时,不会创建额外的对象。只返回所有权。原来分配在堆中的对象保持不变。这样正确吗?
-
在 C++ 中,您可以通过返回对象以及指针(智能指针或原始指针)从函数中返回“事物”。但在 Rust 中,唯一返回“事物”的方法如上,与 C++ 相比接近返回一个智能指针?
【问题讨论】:
-
请记住,C++ 和 Rust 提供了非常不同的功能。 Rust 有 type state,用于跟踪所有权。并且 Rust 已经在编译时检查了强大的所有权语言要求。 C++ 两者都没有。所以比较 Rust 和 C++ 有点像苹果和橘子。
-
将第二个问题作为一个单独的问题提出可能是个好主意,仅回答第一个问题需要一个完整的长答案来解释在 C++ 中返回字符串的详细信息。
-
关于第 2 点:Rust 也有智能指针,
Box与 C++unique_ptr大致相同,Rc与 C++shared_ptr大致相同。在 Rust 中返回内容的唯一方法就是您在此处显示的内容,这不是真的 - 您还可以返回指向堆上对象的Box或Rc。