野指针(Wild Pointer)
定义:野指针是指未初始化或指向已释放内存的指针,其值是随机的或无效的。
产生原因:
- 未初始化:指针声明后未赋值,指向随机地址。
int* ptr; // 未初始化,ptr 是野指针
- 指向已释放内存:指针指向的内存被释放后未置空。
int* ptr = new int(10); delete ptr; // 内存释放,ptr 成为野指针
危害:访问野指针可能导致程序崩溃或未定义行为。
解决方法:
- 初始化指针为
nullptr
。 - 释放内存后将指针置空。
int* ptr = new int(10); delete ptr; ptr = nullptr; // 避免成为野指针
悬挂指针(Dangling Pointer)
定义:悬挂指针是指指向已释放或失效内存的指针,其地址曾经有效但现已无效。
产生原因:
- 局部变量离开作用域:指针指向局部变量,变量离开作用域后指针失效。
int* getPointer() { int x = 10; return &x; // x 离开作用域后,返回的指针是悬挂指针 }
- 对象销毁:指针指向的对象被销毁后未置空。
int* ptr = new int(10); delete ptr; // ptr 成为悬挂指针
危害:访问悬挂指针可能导致未定义行为或程序崩溃。
解决方法:
- 避免返回局部变量的地址。
- 释放内存后将指针置空。
int* ptr = new int(10); delete ptr; ptr = nullptr; // 避免成为悬挂指针
野指针 vs 悬挂指针
特性 | 野指针 | 悬挂指针 |
---|---|---|
定义 | 未初始化或指向无效内存的指针 | 指向已释放或失效内存的指针 |
产生原因 | 未初始化或释放后未置空 | 局部变量离开作用域或对象销毁 |
危害 | 访问可能导致崩溃或未定义行为 | 访问可能导致崩溃或未定义行为 |
解决方法 | 初始化指针为 nullptr ,释放后置空 | 避免返回局部变量地址,释放后置空 |
总结
- 野指针:未初始化或指向无效内存,需初始化或释放后置空。
- 悬挂指针:指向已失效内存,需避免返回局部变量地址或释放后置空。
THE END
暂无评论内容