二级指针解决空悬指针方案

当两个指针指向通过一个地址时,如果其中一个指针对其进行了内存释放,另外一个指针是不知道的,这时候对另一个指针进行操作就会操作段错误等问题。这就是一个空悬指针的案例。例如下面的代码就会使得b指针变成空悬指针

 

 1 /*************************************************************************
 2     > File Name: b.cpp
 3     > Author: Starry
 4     > Mail: 1173298382@qq.com 
 5     > Created Time: 2019年07月15日 星期一 11时08分25秒
 6  ************************************************************************/
 7 
 8 #include<iostream>
 9 #include<stdio.h>
10 using namespace std;
11 
12 int main() {
13     int *a, *b;
14     a = (int*) malloc(sizeof(int*));
15     *a = 10;
16     b = a;
17     printf("%x %x\n",a,b);
18     printf("%d %d\n",*a, *b);
19     free(a);
20     a = NULL;
21     printf("%x %x\n",a,b);
22     printf("%d %d\n",a==NULL, b==NULL);
23     return 0;
24 }

输出结果为:

一开始是指向同一个地址,但当a指针进行了内存释放并指向NULL时,b指针还是指向原来的地址,而并非NULL,如果直接对b指向的内存进行操作就会出问题了。

 

下面通过二级指针解决这个问题,原理是让两个指针指向相同的数据中间在加一层。如下图所示:

这样当一个指针对Object进行释放时,将proxy的值标记为NULL,这样另外一个指针可以查看proxy的值来判断释放进行了内存释放。

代码如下:

 1 /*************************************************************************
 2     > File Name: a.cpp
 3     > Author: Starry
 4     > Mail: 1173298382@qq.com 
 5     > Created Time: 2019年07月15日 星期一 10时54分13秒
 6  ************************************************************************/
 7 
 8 #include<iostream>
 9 using namespace std;
10 
11 
12 int main() {
13     int **a, **b;
14     a = (int**)malloc(sizeof(int*));
15     *a = (int*)malloc(sizeof(int));
16     **a = 10;
17     b = a;
18     printf("%d %d\n",**a, **b);
19     printf("%x %x\n",*a,*b);
20     free(*a);
21     *a = NULL;
22     if(*b == NULL) {
23         printf("YES\n");
24     } else printf("No\n");
25     printf("%d %d\n",*a==NULL,*b==NULL);
26     printf("%x %x\n",*a,*b);
27     return 0;
28 }

输出结果如下:

 

posted @ 2019-07-15 11:24  starry_sky  阅读(361)  评论(0编辑  收藏