堆和栈的内存分配

堆和栈的内存分配

堆和栈的区别

栈(stack):

stack 用于静态分配内存,内存分配发生在连续的内存上。在栈上分配内存,首先编译器要知道分配的内存的大小,没当函数调用时,其变量都会在stack上分配内存。每当函数调用结束时,变量分配的内存就会被释放。这个过程在编译器内有一定的预设,一般来说,程序员不需要考虑内存的分配和释放过程。在stack上分配内存的方式成为临时内存分配,因一旦程序完成执行,该程序使用的所有数据都会在stack中被刷新。

  1. 这是一种临时的内存分配方案,其数据成员只有在包含他们的方法运行时才能被访问。
  2. 一旦其相应的方法完成执行,他就会被自动分配到其他数据或者取消内存分配。
  3. 与在堆上分配内存相比,在栈上分配内存更安全,不会出现内存泄漏问题
  4. 与在堆上分配相比,在栈上内存分配与销毁都更快
  5. 与堆内存相比栈内存使用更少的内存空间。
int main()
{
      //以下变量是在栈上分配内存
      int a;
      double b;
      int num[20];
      return 0;
}

堆(heap)

heap 用于动态内存分配,由程序员在程序运行期间显示指定内存分配与释放。但是heap与heap数据结构无关。之所以称之为堆,是因为它是一堆可供程序员分配和取消分配的内存空间。堆上分配内存不如栈上分配内存安全,因为存储在此空间的数据对所有线程都是可以访问的,如果程序员没有处理好这部分内存,程序中会发生内存泄漏问题。

  1. 如果堆堆占满,程序会自动报错
  2. 与栈内存相比,堆内存没有提供自动解除分配的功能,需要使用垃圾收集器来移除旧的未使用对象。
  3. 与栈内存相比,这部分内存的处理速度比较慢。
int main()
{
    int *ptr = new int[10];
}

stackheap 的对比
stack and heap

stackheap
基本区别内存在连续块中分配内存无序分配
分配和释放规则编译器自动执行程序员手动操作
成本
访问速度
主要问题内存不足内存泄漏
安全性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值