你的“内存”泄露了吗?
内存泄漏那点事
这里我们将字体放大,因为它是我们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);
}
}
上一篇: 有趣易懂的内存泄漏分析与实战