C++迷途指针(dangling pointer)与野指针

1.野指针是指没有初始化的指针,如下:

#include<stdio.h>
int main(int argc,char * argv[]){
	int *p;
	return (*p&0x7f);
}

显然,这个指针p没有初始化就使用了,我们称这种指针为野指针(wild pointer);
这里需要补充一点,如果是静态局部变量,也就是带static的变量,那么它不是野指针,例如这样

int main()
{
	static int *a;
	cout << a << endl;
	return 0;
}

这个a变量不是野指针,因为它是有初始值的,静态指针变量的初始值为0;
当然,这个程序是通不过编译的,所以野指针在一般情况下,更容易被发现。然而迷途指针的发现就难了。
2,迷途指针(悬空指针)(dangling pointer):

#include <stdio.h>
int main(int argc,char *argv[]){

  int *p=(int *)malloc(sizeof(int *));
  free(p);//此时p为迷途指针。
  p=NULL;//当把指针设置为NULL时候,此时指针不再是迷途指针。

}

每一个变量的生命周期都离不开他的作用域,如果超过了他的作用域,很有可能使指向他的指针成为迷途指针,所谓迷途指针,不过是一个长声明周期的指针指向了一个短生命周期的变量引起的,不管这个变量是在栈内存还是在堆内存。如下:

int main(){
	int *P=NULL;
	{
	int a=100;
	p=&a;	
	}
	//一旦离开了变量a的作用域,那么p就是一个迷途指针了。
	return 0;
}

还有下面一个例子:

int * func(){
	int i=5;
	return &i;
}

此时func()函数返回的指针也是迷途指针,虽然在短时间内,可以对指针解引用得到5,但如果func()的栈帧被别的调用函数覆盖了,那么我们就得不到我们想要的结果了,这就是迷途指针的危害。如果真想一直得到这个变量5,我们可以在便令前面加static,让他的生命周期变长。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值