[Rust]悬垂指针

167 阅读1分钟

悬垂指针的定义:指针指向了已经释放或者无效内存位置的指针

悬垂指针的产生:

  1. 内存被释放后还在继续访问指针
#include <stdio.h>
#include <stdlib.h>

int main() {

int *p = (int *)malloc(sizeof(int));

*p = 42;

free(p); // 释放内存,但 p 仍然指向这块内存

printf("%d\n", *p); // 未定义行为,悬垂指针

return 0;

}
  1. 作用域结束后还在使用指针
fn main() {
    let reference_to_nothing = dangle();
}

fn dangle() -> &String { // dangle 返回一个字符串的引用 -> 实际这里会产生编译时错误

    let s = String::from("hello"); // s 是一个新字符串
    &s // 返回字符串 s 的引用
    
} // 这里 s 离开作用域并被丢弃。其内存被释放。
  // 危险

悬垂指针的危害:通过悬垂指针访问内存时,会导致未定义的行为,从而可能引发程序崩溃或者不安全的操作