悬垂指针的定义:指针指向了已经释放或者无效内存位置的指针
悬垂指针的产生:
- 内存被释放后还在继续访问指针
#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;
}
- 作用域结束后还在使用指针
fn main() {
let reference_to_nothing = dangle();
}
fn dangle() -> &String { // dangle 返回一个字符串的引用 -> 实际这里会产生编译时错误
let s = String::from("hello"); // s 是一个新字符串
&s // 返回字符串 s 的引用
} // 这里 s 离开作用域并被丢弃。其内存被释放。
// 危险
悬垂指针的危害:通过悬垂指针访问内存时,会导致未定义的行为,从而可能引发程序崩溃或者不安全的操作