C++(野指针)
野指针(Dangling Pointer)是在C++中指向无效内存地址的指针。野指针通常发生在以下几种情况下:
-
释放了内存但没有将指针设为NULL:
当使用delete
或delete[]
释放内存后,没有置NULL,导致指针随意指向了一个内存地址。int* ptr = new int(10); delete ptr; // ptr现在是野指针
-
栈上对象的指针在超出作用域后继续使用:
当一个指向栈上对象的指针在对象的作用域结束后继续使用,指针将成为野指针。localVariable
是在花括号内部定义的局部变量,当程序执行离开这个花括号时,localVariable
的生命周期结束。int* danglingPointer; { int localVariable = 42; danglingPointer = &localVariable; } // localVariable超出作用域,danglingPointer现在是野指针
-
内存被重新分配:
当指向某块内存的指针,内存被重新分配给其他变量或对象后,原指针也会变成野指针。int* ptr = new int[10]; int* otherPtr = ptr; delete[] ptr; // otherPtr现在是野指针
避免野指针的措施
-
及时将指针设为NULL:
在释放内存后,将指针设为NULL。int* ptr = new int(10); delete ptr; ptr = nullptr; // 现在ptr是一个空指针,而不是野指针
-
使用智能指针:
C++11引入的智能指针(如std::unique_ptr
和std::shared_ptr
)可以自动管理内存的生命周期。std::unique_ptr<int> ptr = std::make_unique<int>(10); // 不需要手动delete,ptr超出作用域时会自动释放内存
-
谨慎使用指针:
避免将栈对象的地址传递到函数外部或保存超出其作用域的指针。 -
使用调试工具:
使用像Valgrind这样的工具来检测和调试内存问题,包括野指针。