linux下使用exit()函数退出进程,那么这个进程中使用malloc申请的内存会被系统回收吗?,如果使用kill函数呢?
|
当一个进程退出后,不管是正常退出或者是异常退出,操作系统都会释放这个进程的资源。包括这个进程分配的内存,打开的文件等等。
用malloc分配的内存属于这个进程使用的内存,在进程退出后,当然会释放。操作系统如果连这个都做不到,那它还能做什么?
4楼引用的那段英文:
Memory obtained with malloc() must be returned to the operating system with a call to free() in order to prevent memory leaks.
是指在一个进程内,必须用free将malloc取得的地址返还给操作系统,以避免内存泄露。而如果进程已终止,就没有这个问题了。
|
我测试一下,不能说是标准的,但可以有这样的结论:进程(Linux)退出时,所申请的内存会自动释放。
#include
#include
#include
void show(struct sysinfo *_sys)
{
printf("Total usable main memory size %dnAvailable memory size %dn",_sys->totalram, _sys->freeram);
printf("Amount of shared memory %dnMemory used by buffers %dn",_sys->sharedram,_sys->bufferram);
printf("Total swap space size %dnswap space still available %dn", _sys->totalswap, _sys->freeswap);
printf("Number of current processes %dn", _sys->procs);
printf("Memory unit size in bytes %ldn", _sys->mem_unit);
}
main()
{
static char suc[]="------------- alloc successful ! --------------",
fai[]="--------------- Fail to alloc ! ----------------";
struct sysinfo _sys;
char *pt;
sysinfo(&_sys);
show(&_sys);
pt=(char *)malloc(80000000); /* 此值可以增大,以强化测试效果 */
if(pt){ strcpy(pt, suc); puts(pt); }
else puts(fai);
sysinfo(&_sys);
show(&_sys);
}
不断地反复运行,得出的结果差不多。
|
Total usable main memory size 2117382144
Available memory size 90734592
Amount of shared memory 0
Memory used by buffers 95215616
Total swap space size 0
swap space still available 0
Number of current processes 86
Memory unit size in bytes 1
------------- alloc successful ! --------------
Total usable main memory size 2117382144
Available memory size 90734592
Amount of shared memory 0
Memory used by buffers 95215616
Total swap space size 0
swap space still available 0
Number of current processes 86
Memory unit size in bytes 1
//释放了~
|
当然都会,OS会程序所有的内存都回收的
要是不回收,崩溃的程序一多系统就崩溃了
|
内存泄露的前提是进程一直在运行;进程一旦推出,所占的整个虚拟内存都被销毁,所有内存资源都会被系统回收。
|
一般情况下不会,在编程时这种情况是不允许的
但对于某些操作系统会有定时的垃圾处理机制,也就是说会定时的扫描系统中是否有这种垃圾数据,如果有系统会自动的把他们释放掉,但这又要增加系统的开销。
|
讨论这个很好,我也在实践和探讨中。
DOS肯定自动释放在结束运行时。
|
Windows 也不会。