您的位置:首页 > 其它

栈和堆,stack和heap,以及程序的内存分配

2014-08-03 20:58 477 查看
stack,栈,准确来说,应该叫“堆栈”。

heap,堆。

程序运行时占用的内存分为如下5个区:

stack,栈,这玩意儿是系统分配的,大小有限,一般windows上默认给程序分配的是1M,所以你会看到stack overflow这种报错。这货一般保存局部变量和函数参数。

heap,堆,这玩意儿是你自己申请和释放的,你不释放那就只能等程序跑完,系统帮你回收了,搞不好就泄漏了。你用什么new、delete、malloc、free啊什么的,操作的那片内存,就是heap。

static,静态区,一般是来放全局变量和static变量(包括static全局变量和static局部变量)。 初始化后的放在一块,没有初始化的放在旁边一块。

文字常量区,常量字符串就存在这里,程序完了后系统自动释放。

代码区,函数的二进制代码。

不过,看到也有资料说,程序运行时占用的内存分为如下五个区:

代码区、初始化数据区、未初始化数据区、堆区、栈区。

我个人感觉上面两种说法应该说的都差不多。因为我们的stack和heap,栈和堆用好了,程序就问题不大了。

在别处看到一个例子,关于程序内存分配的,感觉很有道理。摘录下来,大家看一下:

int a = 0; //全局初始化区
char *p1; //全局未初始化区
main()
{
int b; //栈
char s[] = "abc";// 栈
char *p2; //栈
char *p3 = "123456"; //123456在常量区,p3在栈上。
static int c =0; //全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
//分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); //123456放在常量区,编
4000
译器可能会将它与p3所指向的"123456"优化成一个地方。
}


不过这货好像malloc后没有free啊,哈哈哈
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐