探讨一下关于内存申请与释放的问题!!
int main()
{
int i;
char *temp;
char *msg="helleleleleleleleleleelleleellelelelelelelelelellelelelelelel";
for (i=0;i<1000000;i++) {
temp=(char*)malloc(strlen(msg)+1);
strncpy(temp,msg,strlen(temp));
}
return 0;
}
这个程序运行完,系统的内存会减少么?或者把msg的字符数改的更大,或者把循环改的更大。
我在linux下,运行过程中用top看,内存会急剧减少,但是只要程序运行一结束,内存就会恢复正常。可见内核提供了回收机制。似乎malloc后,可以不调用free。那么只要我们编写的不是守护进程,程序一结束内存就会由系统自动回收。即便是守护进程消耗了大量内存,只要没有死机,我们只要kill掉它也就能够回收内存。
那么某些书上说,编个小程序:malloc一个而没有free掉,就说内存泄漏,如果再多次运行的话,会导致内存耗尽,岂不是不太合理么?
也许我的观点有问题,本人对linux下进程的内存分配与回收还不是很了解,不知道大家有什么看法??
问题点数:20、回复次数:3Top
1 楼nodummy(三甲 之 Linux/Unix里面甭给我分,谁给我分我和谁急)回复于 2005-04-01 16:51:19 得分 20
这个……
汗……楼主似乎不知道你在进程里面分配的内存全都是进程空间的虚拟地址?这些东西在进程正常结束(或者是被咔嚓掉)都会被释放的……
但是如果malloc不free,最终会导致4G的进程空间耗尽(你要是用64位系统,就当我没说,估计除非是非常耗内存的东西,否则基本上提供的周期也够你玩了……另外,你能使用的只有3不到,还有1G是给kernel的),然后你的进程就被kernel咔嚓了……Top
2 楼shirensong(二子)回复于 2005-04-01 17:00:30 得分 0
嗯,我知道,虚拟地址最终都要实际的内存中去申请的。
我的意思是只要我malloc不是太多,程序运行的时间不算太长,而且每次都会正常终止,那我编程序就算不free,也不会造成物理内存泄漏啊。。。。。。(我理的不是太清楚^_^)Top
3 楼nodummy(三甲 之 Linux/Unix里面甭给我分,谁给我分我和谁急)回复于 2005-04-01 17:42:09 得分 0
就是如此,不过光malloc,不free实在是一种值得严重BS的行为……Top




