堆和栈的区别
栈(stack):
stack 用于静态分配内存,内存分配发生在连续的内存上。在栈上分配内存,首先编译器要知道分配的内存的大小,没当函数调用时,其变量都会在stack上分配内存。每当函数调用结束时,变量分配的内存就会被释放。这个过程在编译器内有一定的预设,一般来说,程序员不需要考虑内存的分配和释放过程。在stack上分配内存的方式成为临时内存分配,因一旦程序完成执行,该程序使用的所有数据都会在stack中被刷新。
- 这是一种临时的内存分配方案,其数据成员只有在包含他们的方法运行时才能被访问。
- 一旦其相应的方法完成执行,他就会被自动分配到其他数据或者取消内存分配。
- 与在堆上分配内存相比,在栈上分配内存更安全,不会出现内存泄漏问题
- 与在堆上分配相比,在栈上内存分配与销毁都更快
- 与堆内存相比栈内存使用更少的内存空间。
int main()
{
//以下变量是在栈上分配内存
int a;
double b;
int num[20];
return 0;
}
堆(heap)
heap 用于动态内存分配,由程序员在程序运行期间显示指定内存分配与释放。但是heap与heap数据结构无关。之所以称之为堆,是因为它是一堆可供程序员分配和取消分配的内存空间。堆上分配内存不如栈上分配内存安全,因为存储在此空间的数据对所有线程都是可以访问的,如果程序员没有处理好这部分内存,程序中会发生内存泄漏问题。
- 如果堆堆占满,程序会自动报错
- 与栈内存相比,堆内存没有提供自动解除分配的功能,需要使用垃圾收集器来移除旧的未使用对象。
- 与栈内存相比,这部分内存的处理速度比较慢。
int main()
{
int *ptr = new int[10];
}
stack和heap 的对比
stack | heap | |
---|---|---|
基本区别 | 内存在连续块中分配 | 内存无序分配 |
分配和释放规则 | 编译器自动执行 | 程序员手动操作 |
成本 | 低 | 高 |
访问速度 | 快 | 慢 |
主要问题 | 内存不足 | 内存泄漏 |
安全性 | 高 | 低 |