二级指针解决空悬指针方案
当两个指针指向通过一个地址时,如果其中一个指针对其进行了内存释放,另外一个指针是不知道的,这时候对另一个指针进行操作就会操作段错误等问题。这就是一个空悬指针的案例。例如下面的代码就会使得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 }
输出结果如下: