zoukankan      html  css  js  c++  java
  • free函数使用时的注意事项。

    free函数是我们在写C语言程序时常用的函数,但是使用时需要注意,一不小心很肯能会引起吐核。

    注意:free函数与malloc()函数配对使用,malloc函数释放申请的动态内存。对于free(p)这句语句,如果p 是NULL 指针,那么free 对p 无论操作多少次都不会出问题。如果p 不是NULL 指针,那么free 对p连续操作两次就会导致程序运行错误

    看一个程序

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        char * name = NULL;
        free(name);
        free(name);
        free(name);
        
        printf("no problem11111111
    ");
    
        name = (char *) malloc(10);
        if(name)
        {
            printf("allocate successful
    ");
        }
        else
        {
            printf("allocate failed
    ");
        }
    
        free(name);
        free(name);
        
        printf("no problem2222222
    ");
    
        return 0;
    }

    运行结果:

    这个程序正好验证了上面的注意事项。

    为了避免出现这个错误,自己写了一个函数:

    void myfree(void ** point)
    {
        if(*point !=  NULL)
        {
            free(*point);
            *point = NULL;
        }
    }

    这个函数将一级指针的地址作为菜蔬传入,这样就可以对一级指针进行操作。每次用free释放完空间,都将一级指针置为NULL,这样就避免了重复释放时程序崩溃。

    将这个函数应用到刚才的程序中就是:

    #include <stdio.h>
    #include <stdlib.h>
    
    
    void myfree(void ** point)
    {
        if(*point !=  NULL)
        {
            free(*point);
            *point = NULL;
        }
    }
    
    
    int main()
    {
        char * name = NULL;
        
        myfree((void**)&name);
        myfree((void**)&name);
        myfree((void**)&name);
        
        printf("no problem11111111
    ");
    
        name = (char *) malloc(10);
        if(name)
        {
            printf("allocate successful
    ");
            printf("地址为: %p
    ",name);
    
        }
        else
        {
            printf("allocate failed
    ");
        }
    
        myfree((void**)&name);
        myfree((void**)&name);
        
        printf("no problem2222222
    ");
    
        return 0;
    }

    可以发现程序已经没有错误。

    但是还有一个问题需要处理: 每次调用myfree函数的时候都需要取一级指针的地址而且需要强制类型转换成void** ,也就是每次都要写(void**)&point,这样很麻烦。

    其实我们可以用带参数的宏定义来简化代码,宏定义如下:

    #define FREE(p) myfree((void **)&p)

    应用宏定义后的完整代码:

    #include <stdio.h>
    #include <stdlib.h>
    
    
    #define FREE(p) myfree((void **)&p)
    
    
    void myfree(void ** point)
    {
        if(*point !=  NULL)
        {
            free(*point);
            *point = NULL;
        }
    }
    
    
    int main()
    {
        char * name = NULL;
        
        FREE(name);
        FREE(name);
        FREE(name);
        
        printf("no problem11111111
    ");
    
        name = (char *) malloc(10);
        if(name)
        {
            printf("allocate successful
    ");
            printf("地址为: %p
    ",name);
    
        }
        else
        {
            printf("allocate failed
    ");
        }
    
        FREE(name);
        FREE(name);
        
        printf("no problem2222222
    ");
    
        return 0;
    }

    好了今天就写到这里了,希望对你有帮助,如有不正确的地方,还请指点。多谢~~

  • 相关阅读:
    java基础---->摘要算法的介绍
    startActivityForResult的用法和demo
    Java 获取类名,函数名,行数
    android ListView详解继承ListActivity
    Java List 如何传值
    synchronized的使用方法
    StringUtil
    【转】Java 5种字符串拼接方式性能比较。
    [Android] Intent详解
    TabHost详解
  • 原文地址:https://www.cnblogs.com/qingergege/p/6550410.html
Copyright © 2011-2022 走看看