首页 > 代码库 > windows操作系统对于程序运行时堆栈的管理的研究

windows操作系统对于程序运行时堆栈的管理的研究

通过下面的代码得出了一个结论:

在windows操作系统中,栈空间不会释放,而是如果现有的栈空间满足函数的运行,则不再申请新的栈空间,但函数退出后也不释放栈空间;如果函数运行时占空间不够,则需要再申请新的空间;

使用malloc动态申请的空间因为位于堆空间,free后可以直接释放


#include <stdio.h>

#include <Windows.h>


int hello1()
{
int arra[1000*60];//占用的栈空间大小大概为0.2MB
int i=0;
for(i=0;i<1000;i++)
{
arra[i]=1024;
}
for(i=0;i<40;i++)//等待4秒
{
Sleep(100);
printf("arra[%d] is %d\n",arra[i]);
}
return 0;
}


int hello2()
{
int arra[1000*150];//占用的栈空间大小大概为0.5MB
int i=0;
for(i=0;i<1000;i++)
{
arra[i]=1024;
}
for(i=0;i<40;i++)//等待4秒
{
Sleep(100);
printf("arra[%d] is %d\n",arra[i]);
}
return 0;
}


int hello3()
{
int arra[1000*100];//占用的栈空间大小大概为0.4MB
int i=0;
for(i=0;i<1000;i++)
{
arra[i]=1024;
}
for(i=0;i<40;i++)//等待4秒
{
Sleep(100);
printf("arra[%d] is %d\n",arra[i]);
}
return 0;
}


int main()
{
int i=56;
int ret;
char * tmp_buf;
printf("i is %d\n",i);
for(i=0;i<10;i++)
{
Sleep(1000);
printf("sleep %d seconds\n",i);
}
//hello1()执行前,大概是0.2MB
ret=hello1();
//执行后,大概是0.4MB
hello2();
//hello2()执行后,大概是0.7MB
hello3();
//hello3()执行后,仍然是0.7MB,说明在windows系统中,栈空间会一直增加,而不会减少,但一般不会超过编译器默认的栈大小(程序员不改变的情况下)

printf("game over!");
for(i=0;i<5;i++)
{
printf("over wait %d seconds\n",i);
Sleep(1000);
}

tmp_buf=(char *)malloc(1024*1024);

for(i=0;i<5;i++)
{
printf("over wait %d seconds\n",i);
Sleep(1000);
}
//tmp_buf释放前,程序运行时,占用内存大小为1.8MB
free(tmp_buf);
//tmp_buf释放后,程序运行时,占用内存大小为0.7MB,说明free可以直接释放空间
for(i=0;i<5;i++)
{
printf("over wait %d seconds\n",i);
Sleep(1000);
}
return 0;
}

windows操作系统对于程序运行时堆栈的管理的研究