面试题:C++ 中野指针和悬挂指针的区别?

野指针(Wild Pointer)

定义:野指针是指未初始化或指向已释放内存的指针,其值是随机的或无效的。

产生原因

  1. 未初始化:指针声明后未赋值,指向随机地址。
    int* ptr; // 未初始化,ptr 是野指针
  2. 指向已释放内存:指针指向的内存被释放后未置空。
    int* ptr = new int(10);
    delete ptr; // 内存释放,ptr 成为野指针

危害:访问野指针可能导致程序崩溃或未定义行为。

解决方法

  • 初始化指针为 nullptr
  • 释放内存后将指针置空。
    int* ptr = new int(10);
    delete ptr;
    ptr = nullptr; // 避免成为野指针

悬挂指针(Dangling Pointer)

定义:悬挂指针是指指向已释放或失效内存的指针,其地址曾经有效但现已无效。

产生原因

  1. 局部变量离开作用域:指针指向局部变量,变量离开作用域后指针失效。
    int* getPointer() {
        int x = 10;
        return &x; // x 离开作用域后,返回的指针是悬挂指针
    }
  2. 对象销毁:指针指向的对象被销毁后未置空。
    int* ptr = new int(10);
    delete ptr; // ptr 成为悬挂指针

危害:访问悬挂指针可能导致未定义行为或程序崩溃。

解决方法

  • 避免返回局部变量的地址。
  • 释放内存后将指针置空。
    int* ptr = new int(10);
    delete ptr;
    ptr = nullptr; // 避免成为悬挂指针

野指针 vs 悬挂指针

特性野指针悬挂指针
定义未初始化或指向无效内存的指针指向已释放或失效内存的指针
产生原因未初始化或释放后未置空局部变量离开作用域或对象销毁
危害访问可能导致崩溃或未定义行为访问可能导致崩溃或未定义行为
解决方法初始化指针为 nullptr,释放后置空避免返回局部变量地址,释放后置空

总结

  • 野指针:未初始化或指向无效内存,需初始化或释放后置空。
  • 悬挂指针:指向已失效内存,需避免返回局部变量地址或释放后置空。
THE END
点赞8 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容