C++野指针的存在方式和误区

1.

char* x;这样的一定是野指针,指针声明时要直接初始化!或者置null也行!

2.

1 int main()
2 {
3     char *x=new char;
4     delete x;
5     cout<<*x;
6     getchar();
7     return 0;
8 }

delete x;之后,x就是一个野指针。

 1 int main()
 2 {
 3     char *x=new char[10];
 4     cout<<*x;
 5     strcpy(x,"dqwdqw");
 6     delete []x;
 7     cout<<x;
 8     getchar();
 9     return 0;
10 }

这段代码是能运行的,但delete[]x;之后,x就成为了一个野指针,输出的结果是未定义的。这里我们应该加上:

x=nullptr;

或者malloc之后free掉的指针,也是上面的情况,一定要把指针置null。

3.

函数参数为二级指针&p,将p指向了函数中的临时变量。函数调用完毕后,p这个指针就变为了野指针。

 1 int f(char** x){
 2     char p=97;  //'a'
 3     *x=&p;
 4 }
 5 int main()
 6 {
 7     char a=65;  //'A'
 8     char *x=&a;
 9     f(&x);
10     cout<<*x;
11     getchar();
12     return 0;
13 }

调用f(&x)结束后,指针x指向的值是未定义的。


牛批的来了,看下面代码,感觉会输出什么?

 1 class T 
 2 {
 3 public:
 4     T (){
 5         cout<<"f";
 6         x=1;
 7         delete this;
 8     }
 9     int x;
10 };
11 
12 
13 int main()
14 {
15     T *p=new T();
16     cout<<p->x;
17     getchar();
18     return 0;
19 }

一定觉得这代码会调用失败吧,实际上会调用成功。。

delete this之后,p变为野指针了。但是p依然是个地址。

然后系统就会按照T类的对象空间模型去访问,并输出它认为其中x所在空间的值。

当然这个值就不一定是啥了,但确实不会报错。。。

猜你喜欢

转载自www.cnblogs.com/FdWzy/p/12364947.html