在 C++ 编程中,野指针与悬挂指针各自是如何产生的?它们在定义、成因和危险程度上有哪些不同?请分别说明并给出典型示例。
考察说明
考查对指针生命周期和内存管理基础概念的区分能力。
回答思路
- 【回答框架 1】野指针是指向已释放或未分配内存的指针,其指针变量本身未被初始化或指向无效地址,例如未赋初值的局部指针,行为未定义。
- 【回答框架 2】悬挂指针是指在指针变量有效期间,所指向的对象已被销毁或内存已被释放,指针仍保留旧地址,导致访问悬空内存,例如 delete 后未置空或返回局部变量地址。
- 【回答框架 3】两者核心区别:野指针源于指针未初始化或指向非法位置,而悬挂指针源于指向的对象生命周期结束;野指针可能指向任意地址,悬挂指针的地址曾有效但当前无效。
- 【回答框架 4】典型示例:int* p; 而非 int* p=nullptr; 为野指针陷阱;int* q = new int(5); delete q; 后 q 仍指向已释放内存为悬挂指针,应 q=nullptr。
- 【回答框架 5】避免方法:初始化指针为 nullptr,释放后置空,使用智能指针管理动态内存,避免返回局部对象的地址。
- 【关键点 1】野指针:未初始化或指向无效地址,行为未定义。
- 【关键点 2】悬挂指针:指向已释放或销毁的对象,访问时产生未定义行为。
- 【关键点 3】释放后手动置空或改用智能指针可有效消除悬挂指针。
- 【易错点 1】将野指针与悬挂指针混为一谈,需区分产生原因。
- 【易错点 2】认为 delete 后指针自动变为 safe,实际不置空仍为悬挂指针。
- 【易错点 3】依赖特定编译器或调试信息来判断行为,未定义行为不可预测。