博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言堆内存管理上出现的问题,内存泄露,野指针使用,非法释放指针
阅读量:6676 次
发布时间:2019-06-25

本文共 1375 字,大约阅读时间需要 4 分钟。

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\n”,(unsigned int)pa);		printf(“pa = %s\s”,pa);	}	return;}

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

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

void function2(){	char *pa;	pa = (char*)malloc(sizeof(char)*20);	if(NULL !=pa)	{		strcpy(pa,”hello”);		printf(“pa = %x\n”,(unsigned int)pa);		printf(“pa = %s\s”,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\n”,(unsigned int)pa);		printf(“pa = %s\s”,pa);	}	free(pa);	pa = NULL;	if(NULL != pa)	{		printf(“pa = %s\n”,(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分配出来的。而是中间的一个指针值。

转载地址:http://kerxo.baihongyu.com/

你可能感兴趣的文章
我们容易忽略的WebDriver 的一些方法
查看>>
Windows借助脚本实现自动化加域
查看>>
windows_learn 002 用户管理和组策略
查看>>
我的友情链接
查看>>
在物质与精神之间实现平衡
查看>>
Linux下查找占用内存最多的进程
查看>>
MySQL中TIMESTAMPDIFF和TIMESTAMPADD函数的用法
查看>>
springmvc源码解析之配置加载ContextLoadListener
查看>>
WordPress的WPML外挂出问题恐出现安全漏洞
查看>>
sql学习笔记
查看>>
配置sharepoint 2010错误:Microsoft.SharePoint.Upgrad...
查看>>
UUID 生成算法JS版
查看>>
windows下实现wamp与tomcat环境整合
查看>>
微信公众号的分类
查看>>
MySQL python 数据迁移脚本
查看>>
windows下的grep
查看>>
【书签】valgrind - the dynamic analysis tools
查看>>
Linux Mysql Related
查看>>
Exception练习-Exception的正确使用
查看>>
switch&router-四层模式
查看>>