堆(heap) 为程序保存的一块内存区域,用来保存那些在运行时才知道其存在与大小的数据; 程序能够从堆中分配内存给这些元素;在用完之后,应该释放掉这些内存。 堆中所有的的东西都是匿名的----不能按名字直接访问只能通过指针间接的访问
栈(stack) 为程序保存的一块内存区域,用来保存状态数据, 例如:过程或函数的地址,参数,有时候还包括局部变量。 所以,堆和栈的区别:一个是动态,一个是静态; 堆是在程序运行时动态分配的,而栈的分配是编译完后,就确定了; 栈内存的回收,系统自动进行了,而堆上分配的内存,需要手工显式回收。 malloc , new分配的内存就是在堆上的,如果不用free, delete回收, 就会造成内存泄漏(垃圾),不过,一般操作系统会在整个程序(进程)退出时, 回收分配给这个进程的内存等资源。
堆和栈的区别:
(1)操作系统方面区别:
在使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。
(2)数据结构方面区别:
还有就是数据结构方面的堆和栈,这些都是不同的概念。这里的堆实际上指的就是(满足堆性质的)优先队列的一种数据结构,第1个元素有最高的优先权;栈实际上就是满足先进后出的性质的数学或数据结构。虽然堆栈,堆栈的说法是连起来叫,但是他们还是有很大区别的,连着叫只是由于历史的原因。