C++(野指针)

野指针(Dangling Pointer)是在C++中指向无效内存地址的指针。野指针通常发生在以下几种情况下:

  1. 释放了内存但没有将指针设为NULL:
    当使用deletedelete[]释放内存后,没有置NULL,导致指针随意指向了一个内存地址。

    int* ptr = new int(10);
    delete ptr;
    // ptr现在是野指针
    
  2. 栈上对象的指针在超出作用域后继续使用:
    当一个指向栈上对象的指针在对象的作用域结束后继续使用,指针将成为野指针。

    localVariable 是在花括号内部定义的局部变量,当程序执行离开这个花括号时,localVariable 的生命周期结束。

    int* danglingPointer;
    {
        int localVariable = 42;
        danglingPointer = &localVariable;
    }
    // localVariable超出作用域,danglingPointer现在是野指针
    
  3. 内存被重新分配:
    当指向某块内存的指针,内存被重新分配给其他变量或对象后,原指针也会变成野指针。

    int* ptr = new int[10];
    int* otherPtr = ptr;
    delete[] ptr;
    // otherPtr现在是野指针
    

避免野指针的措施

  1. 及时将指针设为NULL:
    在释放内存后,将指针设为NULL。

    int* ptr = new int(10);
    delete ptr;
    ptr = nullptr;  // 现在ptr是一个空指针,而不是野指针
    
  2. 使用智能指针:
    C++11引入的智能指针(如std::unique_ptrstd::shared_ptr)可以自动管理内存的生命周期。

    std::unique_ptr<int> ptr = std::make_unique<int>(10);
    // 不需要手动delete,ptr超出作用域时会自动释放内存
    
  3. 谨慎使用指针:
    避免将栈对象的地址传递到函数外部或保存超出其作用域的指针。

  4. 使用调试工具:
    使用像Valgrind这样的工具来检测和调试内存问题,包括野指针。

posted @ 2024-06-21 09:37  做梦当财神  阅读(82)  评论(0编辑  收藏  举报