zoukankan      html  css  js  c++  java
  • C语言堆内存管理上出现的问题,内存泄露,野指针使用,非法释放指针

    C语言堆内存管理上出现的问题,内存泄露,野指针使用,非法释放指针


    (1)开辟的内存没有释放,造成内存泄露

    (2)野指针被使用或释放

    (3)非法释放指针


    (1)开辟的内存没有释放。造成内存泄露,以下的样例就可能造成20个字节的泄露,内存泄露不是一个马上会引发故障的错误,可是

    它将消耗系统内存。

    void function1()
    {
    	char *pa;
    	pa = (char*)malloc(sizeof(char)*20);
    	if(NULL !=pa)
    	{
    		strcpy(pa,”hello”);
    		printf(“pa = %x
    ”,(unsigned int)pa);
    		printf(“pa = %ss”,pa);
    	}
    	return;
    }

    (2)野指针被使用或释放

    野指针是一个已经被释放的内存指针,他指向的位置已经被使用free或者realloc函数释放了,可是该指针依旧在使用。


    void function2()
    {
    	char *pa;
    	pa = (char*)malloc(sizeof(char)*20);
    	if(NULL !=pa)
    	{
    		strcpy(pa,”hello”);
    		printf(“pa = %x
    ”,(unsigned int)pa);
    		printf(“pa = %ss”,pa);
    	}
    	free(pa);
    	printf(“ pa = %s”,pa);
    	return;
    }


    正确的内存释放应该是以下的


    void function2()
    {
    	char *pa;
    	pa = (char*)malloc(sizeof(char)*20);
    	if(NULL !=pa)
    	{
    		strcpy(pa,”hello”);
    		printf(“pa = %x
    ”,(unsigned int)pa);
    		printf(“pa = %ss”,pa);
    	}
    	free(pa);
    	pa = NULL;
    	if(NULL != pa)
    	{
    		printf(“pa = %s
    ”,(unsigned int)pa);
    	}
    	return;
    }
    

    (3)非法释放指针


    void function3()
    {
    	char a[20];
    	int b;
    	free(a);
    	free(&b);
    	return;
    }
    

    上面的程序中,a[20]是一个栈上的数组。a是这块内存的地址;b是栈上面的一个变量。&b是它的地址。这些栈上的内存,编译器

    将自己主动管理和回收资源,程序中使用free将他们释放,是一种错误的写法。

    char *pa;
    pa = (char*)malloc(sizeof(char)*20);
    free(pa);
    free(pa);
    

    上面的一段程序。将内存释放两次是错误的写法,由于第一次释放后,该地址已经变成,未分配的堆内存。free函数不能释放未分配的堆内存。


    char *pa;
    char *pa;
    
    pa = (char*)malloc(sizeof(char)*20);
    pb = pa++;
    free(pb);
    

    在上面的程序中,尽管pa是一个被分配出的堆内存指针,pb作为pa的地址加1,也是一个堆内存的指针,并且这个指针所指向的也是已经分配的内存。然而内存pb依旧是非法的内存释放。这是因为这个指针并非从malloc分配出来的。而是中间的一个指针值。



  • 相关阅读:
    oracle数据库性能优化 降低IO
    用bat文件设置程序启动环境
    我的go语言上机测试代码
    解决golang.org不能访问的问题
    go语言 windows 32位编译环境搭建
    JQueryEasyUI学习笔记(十一)datagrid 右键菜单,冻结列
    JQueryEasyUI学习笔记(十二)datagrid 提示、格式化表格、表格按钮(附源码)
    JQueryEasyUI学习笔记(十四)tree
    JQueryEasyUI学习笔记(十三) 更换主题皮肤
    JQueryEasyUI学习笔记(七)datagrid
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5268152.html
Copyright © 2011-2022 走看看