码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2016-03-12 11:47:04      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:

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分配出来的。而是中间的一个指针值。



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

标签:

原文地址:http://www.cnblogs.com/mengfanrong/p/5268152.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!