你的“内存”泄露了吗?

内存泄漏那点事

这里我们将字体放大,因为它是我们c语言阶段最重要的问题,也是我们最容易忽视的问题,也许你现在是不会理解到它的威力到底有多大,这里我们就谈谈内存泄漏的那点事

内存泄漏是什么?

  • 内存泄漏是指我们在c语言中malloc()申请一段空间的时候,我们在使用过久但是并没有对其进行free(),这样导致我们先前malloc()申请的空间就一直被占着,而且我们并没有对其进行使用,这段内存也不会被再一次申请到,因为这段已经被其他申请了,但是又将其抛弃。举个例子,一段内存就是一个手机号码,我们再使用它的时候它就可以被我们所用,但是再我们不被使用的时候我们就不可以使用它,并且其他人也不能去使用它。但是有一个操作free(),就相当于注销卡,再执行过这个操作后我们就就可以让其他的用户(malloc())去使用它。

  • 也许你会说我的内存很大,一次两次甚至上百次malloc()都不会将我电脑中的内存全部给申请调。但是我们看看下面这段代码

#include <stdio.h> 
#include <stdlib.h>
int main() {	
	while (1)
	{
		int *p = (int*)malloc(10, sizeof(int));
	}
	system("pause");
	return EXIT_SUCCESS;
}

此时我们程序就会一直执行下去,知道你的内存不够的时候就会发射管中断,时间不会太长,因为我们malloc()申请的空间都在栈空间上(以后讨论栈空间和堆空间)。我们的服务器程序会一直24X7不停运转。发生这个问题后我们的服务器就会奔溃。所以一定要注意这个问题

怎样去防止内存泄漏
上面我们说了内存泄漏的危害是如此的大,有没有什么办法去防止它呢,这时候我们好像没有太好的答案,一起说没有太好的答案,不如说这个问题只能靠我们程序员自我修养,再malloc()一定要加上free()。但是我们都不是神仙,总会有犯错的时候,再我们学习到c++中后我们就有办法去防止这种问题,那就是----智能指针。就是用一个类中去维护一个指针(这里我们学习到c++后详细讨论)

  • -内存泄漏题
#include <stdio.h> 
#include <stdlib.h>
int main() {	
	Test();
	system("pause");
	return EXIT_SUCCESS;
}
void GetMemory(char *p) { 
	p = (char *)malloc(100); 
} 
void Test(void) 
{ 
	char *str = NULL;    
	GetMemory(str);    
	strcpy(str, "hello world");    
	printf(str); 
}

提示:变量的作用域

#include <stdio.h> 
#include <stdlib.h>
int main() {	
	Test();
	system("pause");
	return EXIT_SUCCESS;
}
char *GetMemory(void) { 
	char p[] = "hello world";    
	return p; 
} 
void Test(void) { 
	char *str = NULL;    
	str = GetMemory();    
	printf(str); 
}

提示:作用域问题

#include <stdio.h> 
#include <stdlib.h>
void Test(void);
int main() {	
	Test();
	system("pause");
	return EXIT_SUCCESS;
}
void Test(void) {
	char *str = (char *)malloc(100);
	strcpy(str, "hello");
	free(str);
	if (str != NULL) {
		strcpy(str, "world");
		printf(str);
	}
}

猜你喜欢

转载自blog.csdn.net/boke_fengwei/article/details/88408321