内存分配
堆(heap):堆存储的内容一般由用户申请和释放,若用户没有释放一般在程序运行完成以后,由操作系统回收。一般由new,malloc申请的变量才存放在堆中。
栈(stack):栈由编译器(compiler)自动申请和释放,函数参数及调用地址,局部变量的值都存放在栈中。
大小及存储结构方式
堆:内存分配的堆不同于数据结构里的堆。内存分配的堆存放内容并不连续,而是类似于链表的分配方式。操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样代码中的delete语句才能正确的释放本内存空间。另外由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。
windows下,堆的大小一般等于虚拟内存的大小,一般是1G。
栈:在windows下,栈是一块连续的区域,并且栈顶地址及栈的容量是系统设置好的,即栈的大小固定,同时由高地址向地址扩展。
栈的大小一般较小,为1M左右,所以可申请的空间较小,当申请空间超过栈大小的时候会报“stackoverflow”的错。
测试本机大致栈的大小
#include <stdlib.h>
#include <iostream>
#include <windows.h>
using namespace std;
int stackApp(int & count)
{
int a =