(1)什么是野指针
野指针是 一种未被初始化的指针,通常会指向一个随机的内存地址。这个地址不可预测的,所以可能会导致 程序和数据出现错误
(2)在什么情况下会产生野指针?
-
初始化指针时,没有将它置为nullptr,或一个有效的地址
-
在释放内存后 没有置空指针。使用delete 或 free 释放内存后,没有 将指针设置为nullptr,此时指针仍然指向 已释放的内存地址
-
返回指向 局部变量 的指针。如果 函数返回了指向其 局部变量 的指针,当函数调用结束,这些 局部变量的生命周期 也就结束了,所以此时返回的指针就成了野指针
-
指针越界访问,比如数据一工有10个元素,而指针却遍历到第10个元素之后的位置
#include <stdio.h> int main() { int arr[10]={0]; int* p=arr; for(int i=0;i<12;i++) { *p++=i; } return 0; }
-
指针作为函数参数传递 或 作为返回值返回时,指针所指向的内存 在函数内部被释放了,此时 实参指针成了野指针
(3)如何避免野指针
-
初始化指针时,要将它置为nullptr或 一个有效地址
-
在释放内存后 将指针置为 nullptr
-
不要返回 指向局部变量的指针
-
使用 智能指针,比如 unique_ptr、shared_ptr
-
注意 函数参数的生命周期,避免 在函数内部释放 传递进来的指针所指向的内存