Pointers 是什么使得在rust中返回引用字符串成为悬空指针? fn dangle()->&String{//dangle返回对字符串的引用 设s=String::from(“hello”);//s是一个新字符串 &s//返回对字符串s的引用 }

Pointers 是什么使得在rust中返回引用字符串成为悬空指针? fn dangle()->&String{//dangle返回对字符串的引用 设s=String::from(“hello”);//s是一个新字符串 &s//返回对字符串s的引用 },pointers,rust,memory-leaks,Pointers,Rust,Memory Leaks,浏览rust book并了解所有权,返回对字符串的引用如何使其成为悬空指针?您正在引用的字符串位于函数内部(仅限于函数)。这意味着,编译器将把为这个字符串分配和释放内存的管理代码放入这个函数中。因此,编译器必须在返回到调用方之前取消分配s的内存。但是,&s现在将引用一个已解除分配的项,即悬挂指针。此代码无法编译,因为局部变量s在作用域末尾(即函数)被自动删除,因此您无法指向它。“悬挂指针”或“悬挂引用”是一种编程习惯用法,表示引用已解除分配的数据。由于s有一个明确定义的范围,该范围以函数的结尾结

浏览rust book并了解所有权,返回对字符串的引用如何使其成为悬空指针?

您正在引用的字符串位于函数内部(仅限于函数)。这意味着,编译器将把为这个字符串分配和释放内存的管理代码放入这个函数中。因此,编译器必须在返回到调用方之前取消分配s的内存。但是,
&s
现在将引用一个已解除分配的项,即悬挂指针。

此代码无法编译,因为局部变量s在作用域末尾(即函数)被自动删除,因此您无法指向它。“悬挂指针”或“悬挂引用”是一种编程习惯用法,表示引用已解除分配的数据。由于
s
有一个明确定义的范围,该范围以函数的结尾结束,因此当函数返回时,其数据将被释放。这就是为什么从函数返回时,对字符串(或字符串中的数据)的引用会“悬空”的原因。此外,您的问题有一个“内存泄漏”标记。悬空引用与内存泄漏相反,它是空闲后使用。换句话说,对于悬空引用,数据的释放太早,而不是太迟。