野指针和空悬指针的区别

  1. 野指针:
  • 定义:野指针是指已经指向了某块内存的指针,但是该内存区域已经被释放或者不再有效,但指针本身仍然保留该地址。
  • 产生原因:
    • 使用 delete 或 free 释放了指针指向的内存后,但忘记将指针置为 nullptr(C++)或 NULL(C)。
    • 指向局部变量的指针,而局部变量的生命周期已经结束。
  • 危险性:
    • 访问野指针可能导致程序崩溃、未定义的行为,或者导致不可预测的结果,因为指针指向的内存可能已经被其他程序使用或者释放。
  1. 空悬指针:
  • 定义:空悬指针是指指针本身合法,但指向的对象已经被销毁或者不再有效。
  • 产生原因:
    • 指向对象的引用,在对象被销毁后,引用仍然存在。
    • 返回局部对象的指针或引用,而在函数返回后,局部对象已经不存在。
  • 危险性:
    • 使用空悬指针可能导致程序崩溃、未定义的行为,或者导致不可预测的结果,因为引用的对象已经不存在或者被其他数据覆盖。
图片[1]-野指针和空悬指针的区别-不念博客

例子:

#include <iostream>

int* createInt() {
    int x = 5;
    return &x; // 返回局部变量的指针
}

int main() {
    int* ptr = createInt();
    // 在这里,ptr 成为野指针,因为它指向的是已经销毁的局部变量
    std::cout << *ptr << std::endl; // 可能导致未定义行为

    // 其他可能导致野指针的操作
    int* deletedPtr = new int;
    delete deletedPtr;
    std::cout << *deletedPtr << std::endl; // deletedPtr 成为野指针

    // 空悬指针
    int* danglingPtr = nullptr;
    {
        int x = 10;
        danglingPtr = &x; // x 的生命周期结束后,danglingPtr 成为空悬指针
    }
    std::cout << *danglingPtr << std::endl; // 可能导致未定义行为

    return 0;
}
© 版权声明
THE END