百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

还有多少人搞不懂堆内存和栈内存的区别?

off999 2025-09-29 09:45 38 浏览 0 评论

这篇文章分享一个面试中经常被问到的知识点:堆内存和栈内存有什么区别?平时开发应该使用堆内存还是栈内存?

要回答这个问题,我们首先需要知道什么是堆内存,什么是栈内存,它们的分配和回收有什么特点?


先介绍下栈内存:

栈内存是为线程留出的临时空间,每个线程都有一个固定大小的栈空间,而且栈空间存储的数据只能由当前线程访问,所以它是线程安全的。

栈空间的分配和回收是由系统来做的,我们不需要手动控制。

当一个函数调用时,系统就会为该函数的调用分配栈空间,当函数返回后,系统就会自动回收这块空间,同理,下次其它函数调用和返回,系统还是会自动分配和回收空间。

那它是怎么分配和回收的呢?

可以看这两个动画

栈空间的大小是固定的,它有一个水位线,标识栈空间的分配状态,水位线里面的表示已经分配,然后这个水位线会根据函数调用和返回的情况自动调整。

这里可以看到,栈空间的分配和回收非常简单,只需要调整水位线位置就可以了,没有任何多余操作。


那堆内存呢?

我们平时在C语言和C++中使用malloc和new分配的内存就是堆内存,堆内存的一大特点就是大小不固定,可以动态扩容,空间由程序员动态分配,更加灵活。

然而,既然有优点也必然伴随着缺点。

第一个缺点就是它容易产生内存泄露,malloc出来的没有free,new出来的如果没有delete,都会产生内存泄露,真正项目内存泄露产生的情况肯定比这个复杂的多。

第二个缺点,容易产生内存碎片,在分配和回收时需要对很多内存碎片进行整理,效率较低,具体可以看这个动画。

所以才会有很多自定义的内存分配器,但它肯定还是没有栈空间分配回收速度快。

第三个缺点,线程不安全,它不像栈内存是线程独立的,堆内存可以被一个进程内所有的线程访问,多线程操作就容易产生问题,很多奇奇怪怪的操作就是这么引起的。

相关视频推荐

90分钟了解Linux内存架构,numa的优势,slab的实现,vmalloc的原理

linux内存管理-庞杂的内存问题,如何理出自己的思路出来

学习地址:C/C++Linux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂

需要C/C++ Linux服务器架构师学习资料加qun812855908获取(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等),免费分享


那什么变量存储在栈上,什么存储在堆上呢?普通的A a,这种就是都存储在栈上,当使用new和malloc分配的空间会存储在堆上,看这个图:

new出来的实际空间是在堆上分配,然后在栈上开辟一个指针大小的空间,这个空间有一个指针,指向堆上的那块内存,这样给变量和堆内存之间就关联起来了。


那什么情况下使用栈内存,什么情况下使用堆内存呢?

我整理出来了一个表,贴在这里:


速度

空间管理

高效,不会产生碎片

会产生内存碎片

访问权限

只能局部变量

可以访问全局变量

空间大小限制

操作系统限制

没有特定的限制

内存分配

连续

随机分配

分配和释放

编译器指令自动管理

程序员手动管理

开销

主要问题

空间小

内存碎片

灵活性

固定大小

可以resize

这里可以根据实际需求来决定使用哪类内存。

当然,其实也不用关注那么多,我一般就是大内存使用堆,局部变量小内存使用栈。

这里还涉及到很多其它知识点,比如进程的内存空间布局是怎么样的,栈空间会不会污染、堆内存具体是怎么分配和回收的。

最后是提问环节,大家可以在评论区讨论一下哈。

  • 当定义一个vector<int> a(100); a在哪块内存?那100a的空间又在哪里?
  • 当定义一个array<int, 100> a; a在哪块内存,那100个a的空间又在哪里?

相关推荐

下载手机卫士(下载手机卫士官方版)

360手机卫士苹果版来自奇虎360推出的一款iPhone手机管理软件,360手机卫士苹果版推为iOS用户提供专业、完善和高效的移动设备管理服务,360手机卫士手机版可以实现流量监控、电池管家、隐私空间...

免费破解软件下载网站(免费破解版软件)

可以用腾讯手机管家的小火箭,它的功能很好用。安装完成以后,手机屏幕上就有那个加速圈--小火箭。使用小火箭加速平均提升手机速度35%。按住小火箭移到最下方,释放升空,即可轻松清理多余后台进程,释放手机内...

应用管家下载(应用市场官方正版下载安装)

1、在手机桌面找到腾讯手机管家,点击打开。2、找到右上角的头像,点击进入个人界面。3、点击右上角的齿轮图标,点击进入设置界面。4、找到安全检测,点击进去。5、找到屏幕下方的恶意网址拦截6、这样就把网址...

联通网上营业厅官网(中国联通官网登录入口)
联通网上营业厅官网(中国联通官网登录入口)

联通综合门户网站网上营业厅是中国联通推出的全国统一网上营业厅,中国联通网上营业厅为用户提供话费查询、话费充值、业务办理等服务,还提供3G号码、4G号码、3G套餐、4G套餐、5G套餐、手机、手机配件和充值卡购买等服务。还可以购买套餐,送手机等...

2026-02-02 14:43 off999

联盟平台app(联盟平台app下载)

英雄联盟除了wegame别的基本上不可以用,因为如果是非腾讯合作伙伴,运行英雄加盟应该是被判为外挂插件,或者是你直接启动客户端不用任何插件这样也可以。原来用的是tgp后来一点点被改成了wegame,...

炒股神器免费版(炒股神器是真的吗)
炒股神器免费版(炒股神器是真的吗)

炒股,指倒买倒卖股票。炒股的核心内容就是通过证券市场的买入与卖出之间的股价差额,获取利润。现在越多越来的人都了闲钱,可以用来投资理财。而炒股是许多人以钱生钱的首要选择,炒股回报高但是风险也极高。我们需要一款好的手机炒股软件来辅助我们判断。下...

2026-02-02 14:03 off999

软件商店oppo官方下载(软件商店oppo官方下载最新版安装newwear)

在桌面找到软件商店在oppo的桌面上找到软件商店,也就是应用商店。打开商店看到软件打开商店之后,能够看到有很多的软件。下载软件看详细信息在此界面可以进行下载软件,看到软件的详细信息。OPPO手机...

红警下载(红警下载中文版下载)

网上直接搜可以找到很多下载资源,但是这些资源不一定能用!如果真想玩,建议直接在某宝花几块钱购买资源,不仅方便而且会教给你怎么设置,出现什么问题怎么解决,很方便!这款游戏资源不是很好找,网上一搜确实能找...

申请qq号码官网(申请qq号码官方网站)

1、首先打开手机上的qq,然后点击新用户注册。2、在弹出的页面输入手机号码,并点击下一步。3、将手机收到的验证码输入下方的输入框内。4、在弹出的页面中点击继续注册。5、在弹出的页面中,点击不绑定。6、...

在哪里找软件开发公司(怎么找开发软件的公司)

建立一个软件开发公司一般需要有一个技术团队和一个业务团队,以及一个面向行业的成熟的框架。开发公司一般都有一个有相对有技术实力的团队为开发做支撑,另外现在快速开发也是越来越流行,快速开发依赖于一个相对成...

奇书网txt下载全文免费下载(余下全文免费阅读app下载)

奇书网创建于2006年09月25日,奇书网小说下载网是专业的TXT小说下载,TXT电子书下载,手机小说下载网站。每日更新最新,最热门全集全本完结小说的TXT电子书免费下载。该站已收录小说39000多部...

养成类单机游戏(养成类手游排行榜前十名)

经营类:1、游戏发展国2、吃货大食堂3、冒险迷宫村4、和风物语5、口袋商业街6、二战风云7、蘑菇园8、模拟人生系列角色扮演类:1、艾亚迪诺32、艾亚迪诺43、泽诺尼亚34、刺客信条动作类:1、蜘蛛侠2...

下载会声会影免费版(下载会声会影免费版软件)
下载会声会影免费版(下载会声会影免费版软件)

会声会影X5安装步骤:1、首先要进行会声会影下载,下载完成后双击运行“会声会影x5.exe”文件,等待安装。2、认真阅读最终用户许可协议,勾选“我接受许可协议中的条款”,点击下一步。3、在城市/区域中选择“中国”,视频标准选择“PAL/SE...

2026-02-02 12:15 off999

我要自学网官方网站(我要自学网app下载)
  • 我要自学网官方网站(我要自学网app下载)
  • 我要自学网官方网站(我要自学网app下载)
  • 我要自学网官方网站(我要自学网app下载)
  • 我要自学网官方网站(我要自学网app下载)
qq飞车官方正版下载(qq飞车官方正版下载手机版)

这得看LZ家是什么电脑,如果是笔记本就要2个小时左右,苹果只要20分钟,,,大电脑的话就得看宽带了,电脑性能也很重要,不过差不多要1个小时左右下载QQ飞车体验服需要按照以下步骤进行:在手机应用商店搜...

取消回复欢迎 发表评论: