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


    当两个指针指向通过一个地址时,如果其中一个指针对其进行了内存释放,另外一个指针是不知道的,这时候对另一个指针进行操作就会操作段错误等问题。这就是一个空悬指针的案例。例如下面的代码就会使得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
    ",a,b);
    18     printf("%d %d
    ",*a, *b);
    19     free(a);
    20     a = NULL;
    21     printf("%x %x
    ",a,b);
    22     printf("%d %d
    ",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
    ",**a, **b);
    19     printf("%x %x
    ",*a,*b);
    20     free(*a);
    21     *a = NULL;
    22     if(*b == NULL) {
    23         printf("YES
    ");
    24     } else printf("No
    ");
    25     printf("%d %d
    ",*a==NULL,*b==NULL);
    26     printf("%x %x
    ",*a,*b);
    27     return 0;
    28 }

    输出结果如下:

  • 相关阅读:
    Codeforces 220C
    Codeforces 697D
    HDU 4417
    Codeforces 396C
    Codeforces 246C
    HDU 6333
    HDU 3389
    总结:树上启发式合并
    HDU 6319
    Codeforces 1009G
  • 原文地址:https://www.cnblogs.com/xingkongyihao/p/11187819.html
Copyright © 2020-2023  润新知