欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

你的“内存”泄露了吗?

程序员文章站 2022-03-02 14:36:55
...

内存泄漏那点事

这里我们将字体放大,因为它是我们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);
	}
}
相关标签: 内存泄漏