【C++八股】野指针和悬空指针
野指针(Wild Pointer)是指未被初始化或指向非法内存地址的指针。在 C/C++ 等语言中,指针变量如果在定义时未被初始化,其值是随机的,可能指向任意内存位置,这种指针被称为野指针。使用野指针进行解引用操作会导致未定义行为,可能引发程序崩溃或数据损坏。
野指针的产生原因
1. 未初始化的指针: 指针在声明时未被赋予有效的内存地址,默认值是随机的。
int* ptr; // ptr 是野指针,未初始化
2. 指向已释放内存的指针: 指针指向的内存已被释放,但指针本身未被置为 nullptr
,导致指针仍指向已释放的内存。
int* ptr = new int(10);
delete ptr; // ptr 变为悬空指针
// ptr 仍指向已释放的内存
避免野指针的方法
1. 初始化指针: 在声明指针时,立即将其初始化为 nullptr
或有效的内存地址。
int* ptr = nullptr; // 初始化为空指针
2. 释放内存后置空指针: 在使用 delete
或 free
释放内存后,立即将指针置为 nullptr
,防止悬空指针的产生。
int* ptr = new int(10);
delete ptr;
ptr = nullptr; // 防止悬空指针
3. 使用智能指针: 在 C++ 中,使用 unique_ptr
或shared_ptr
等智能指针来管理动态内存,智能指针会在超出作用域时自动释放内存,减少野指针的风险。
#include <memory>
std::unique_ptr<int> ptr = std::make_unique<int>(10);
// ptr 超出作用域时,自动释放内存
总之,野指针是指向非法内存地址的指针,使用时需特别小心。通过初始化指针、释放内存后置空指针以及使用智能指针等方法,可以有效避免野指针的产生,确保程序的稳定性和安全性。
野指针和悬浮指针的区别
野指针和悬空指针都是指向无效内存区域的指针
野指针 定义: 未被初始化的指针,指向随机的内存地址。
产生原因: 指针声明时未进行初始化,导致其值为随机值。
悬空指针 定义: 指向已释放或超出作用域的内存地址的指针。
产生原因: 指针指向的内存已被释放,但指针本身未被置为 nullptr
,导致指针仍指向已释放的内存。