【问题标题】:What makes returning a reference String in rust a dangling pointer?是什么让 rust 中返回的引用字符串成为悬空指针?
【发布时间】:2021-08-18 18:36:22
【问题描述】:
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
}

翻阅 rust book 并了解所有权,返回对 String 的引用如何使其成为悬空指针?

【问题讨论】:

  • 此代码无法编译,因为局部变量 s 在作用域(即函数)结束时会自动删除,因此您无法指向它。
  • “悬空指针”或“悬空引用”是一种编程习惯用法,表示对已释放数据的引用。由于s 有一个明确定义的范围,该范围以函数的结尾结束,所以它的数据将在函数返回时被释放。这就是为什么从函数返回时对字符串(或字符串内的数据)的引用会“悬空”。
  • 另外,您的问题有一个“内存泄漏”标签。悬空引用是内存泄漏的inverse,它是一个use-after-free。换句话说,对于悬空引用,数据被释放得太早,而不是太晚。

标签: pointers rust memory-leaks


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2021-12-18
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多