每日一问9:关于野指针

C++每日一问9:关于野指针

1.什么是野指针

​ 野指针(wild pointer),也就是指向了一个未知位置的指针,解引用一个野指针就是访问一个不确定的地址,获取一个不确定的结果。

2.野指针的成因

​ 野指针的成因一般有三种:

1.指针变量声明时未初始化

int main()
{
	int* a ;  					//定义指针时,未初始化,指针指向随机地址
	cout << "a:"<<a<<ends<<"*a:"<<*a<<endl;		//使用为初始化的指针,error
	return 0;
}

2.指针释放后未置空

int main()
{
	int* a = new int(2);						
	delete a;		//释放指针后没有将指针置为空,随后继续使用该指针,error
	cout << "a:"<<a<<ends<<"*a:"<<*a<<endl;
	return 0;
}

3.指针操作超越变量作用域。不要用指针指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。此时,指针就会指向一个未知的地址。

int* func(int a)		//返回了一个临时变量的地址,函数当时可能会正确运行。但接下来的任何函数调用都会覆盖num的地址,
{				//这时再读取num的值就不正确了
    int num = a;
    return &num;
}

int main()
{
	int* a = fun(3);
	cout << *a << endl;
	int* b = fun(4);
	cout << *a << endl;
	return 0;
}

2.与悬垂指针(Dangling pointer)的区别

​ 悬垂指针也叫迷途指针,其实也可以看作野指针。如果非要做出区别,那么悬垂指针是指,当所指向的对象被释放或者收回,但是对该指针没有作任何的修改,以至于该指针仍旧指向已经回收的内存地址。而野指针是指,未经初始化的指针。这里没有必要太计较。

3.如何避免野指针

  - 最大的建议就是,有条件时使用封装更加完善的智能指针。
  - 养成良好编程习惯。定义指针时一定要初始化;释放指针所指向的内存空间时,同时也要置指针为NULL;
原文地址:https://www.cnblogs.com/honernan/p/14095490.html