蒋豆芽的面试题专栏(3/内存管理)

  1. 堆和栈的区别⭐⭐⭐⭐⭐

  2. 请你说说野指针⭐⭐⭐⭐⭐

  3. 请你说说内存泄露⭐⭐⭐⭐⭐

  4. 在函数中申请堆内存需要注意什么?⭐⭐⭐⭐⭐

  5. 请你说说内存碎片⭐⭐⭐⭐⭐

  6. 请你说说malloc内存管理原理⭐⭐⭐⭐⭐

  7. 什么是内存池⭐⭐⭐⭐⭐

  8. 说说new和malloc的区别,各自底层实现原理⭐⭐⭐⭐⭐

  9. 说说使用指针需要注意什么?⭐⭐⭐⭐⭐

  10. 初始化为0的全局变量在bss还是data⭐⭐⭐⭐⭐

=========================================================================================================

  • 本专栏适合于C/C++已经入门的学生或人士,有一定的编程基础。
  • 本专栏适合于互联网C++软件开发、嵌入式软件求职的学生或人士。
  • 本专栏针对面试题答案进行了优化,尽量做到好记、言简意赅。这才是一份面试题总结的正确打开方式。这样才方便背诵
  • 针对于非科班同学,建议学习本人专刊文章《蒋豆芽的秋招打怪之旅》,该专刊文章对每一个知识点进行了详细解析。
  • 如专栏内容有错漏,欢迎在评论区指出或私聊我更改,一起学习,共同进步。
  • 相信大家都有着高尚的灵魂,请尊重我的知识产权,未经允许严禁各类机构和个人转载、传阅本专栏的内容。

=========================================================================================================

  1. 堆和栈的区别⭐⭐⭐⭐⭐

    图片说明

    1. 堆栈空间分配不同。栈由操作系统自动分配释放 ,存放函数的参数值局部变量的值等,栈有着很高的效率;堆一般由程序员分配释放,堆的效率比栈要低的多
    2. 堆栈缓存方式不同。栈使用的是一级缓存, 它们通常都是被调用时处于存储空间中,调用完毕立即释放;堆则是存放在二级缓存中,速度要慢些。
    3. 空间大小: 栈的空间大小并不大,一般最多为2M,超过之后会报Overflow错误。堆的空间非常大,理论上可以接近3G。(针对32位程序来说,可以看到内存分布,1G用于内核空间,用户空间中栈、BSS、data又要占一部分,所以堆理论上可以接近3G,实际上在2G-3G之间)。
    4. 能否产生碎片: 栈的操作与数据结构中的栈用法是类似的。‘后进先出’的原则,以至于不可能有一个空的内存块从栈被弹出。因为在它弹出之前,在它上面的后进栈的数据已经被弹出。它是严格按照栈的规则来执行。但是堆是通过new/malloc随机申请的空间,频繁的调用它们,则会产生大量的内存碎片。这是不可避免地。
  2. 请你说说野指针⭐⭐⭐⭐⭐

    野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)

    野指针不同于空指针,空指针是指一个指针的值为null,而野指针的值并不为null,野指针会指向一段实际的内存,只是它指向哪里我们并不知情,或者是它所指向的内存空间已经被释放,所以在实际使用的过程中,我们并不能通过指针判空去

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

- 本专栏适合于C/C++已经入门的学生或人士,有一定的编程基础。 - 本专栏特点: 本专刊囊括了C语言、C++、操作系统、计算机网络、嵌入式、算法与数据结构、数据库等一系列知识点,总结出了高频面试考点(附有答案)共计309道,事半功倍,为大家春秋招助力。 - 本专栏内容分为七章:共计309道高频面试题(附有答案)

全部评论
欢迎大家留言分享感悟
2 回复 分享
发布于 2021-03-08 18:38
请你说说malloc内存管理原理:这里简谈下malloc的思路,最后放一些参考资料。(1)程序运行的时候会产生堆(stack)区和栈(heap)区,还有一个是文件映射区(Memory Mapping Region--mmap),malloc就是处理heap和mmap。(2)既然分为两部分,代表两种不同的场景,鉴于此,专门有对应的函数进行处理,brk()、sbrk()是增加heap的上界brk;mmap()和munmap()管理mmap区(3)C库进一步封装,对外提供malloc和alloc等函数,这就是为什么这些函数名都不知道,因为malloc进行了封装(4)当申请的内存小于128KB,malloc调用sbrk(),sbrk()是C库函数,进一步调用系统调用brk()(5)当申请的内存大于128KB。 malloc调用mmap ()为什么要再度封装,提供malloc等函数呢? brk()、sbrk()、mmap()和munmap()属于底层调用,如果频繁的调用会严重影响系统的性能。所以由glic帮助程序员管理内存,以内存池为基础的内存分配与回收,即使使用free后,内存也不会立即返回给系统,而是在glic中的内存池里,方便用户的下一次请求。 最后分享下资料,网上大部分关于malloc的底层原理都出自一人的文档,淘宝的--glibc内存管理ptmalloc源代码分析.pdf,原始文档 https://gitee.com/ve2102388688/pdf http://luodw.cc/2016/02/17/malloc/ https://www.cnblogs.com/mysky007/p/12349508.html
2 回复 分享
发布于 2021-04-19 10:14
针对于栈和堆的空间大小问题,这里感谢@无痕丶201909072125130同学提供的甄别,豆芽针对答案更加地严谨化了。
1 回复 分享
发布于 2021-03-11 22:54
豆芽在写作的过程中难免存在误区或疏忽的地方,希望大家提出来我们一起探讨订正,感谢大家。
1 回复 分享
发布于 2021-03-11 22:55
new返回的指针不需要检查null吧,只要没异常就是成功的
1 回复 分享
发布于 2021-03-12 11:03
用free或delete释放了内存之后,立即将指针设置为NULL,防止“野指针”。这种情况应该是悬空指针吧
1 回复 分享
发布于 2021-03-12 13:16
怎么突然收费了
1 回复 分享
发布于 2021-03-18 09:26
1. 堆和栈的区别 堆栈缓存方式不同:这么说是事实但不太严谨,在Intel x86后续的体系中,L1缓存不再存储数据,转而存储L2的指令代码。栈主要存储函数调用的指针和局部变量,也不适合存储数据。如果在程序中定义很大的数组,是很差的编程习惯。这样栈存储在L1缓存是有原因的。栈的空间比较小,在Windows下是1M,大概是2^20/2^2=2^18个int,换句话说,在程序中调用2^18个函数?显然是不会的,这样就可以理解栈的大小是比较小的。而Linux的默认栈是8M,这些参数都可以修改。因为有些情况下就必须使用大数组,比如在FPGA的HLS就有可能定义大数组,因为用不了malloc、new
1 回复 分享
发布于 2021-04-14 17:20
想补充下,内存泄露。第三点是资源泄漏,比如文件句柄、socket、自定义资源类没有使用对应的资源释放函数。还有shared_ptr成环。
1 回复 分享
发布于 2021-04-14 19:42
想补充下,野指针我理解的是,指向已经释放的内存区域,或者没有访问权限的区域(OS保留,其他进程)
点赞 回复 分享
发布于 2021-04-14 17:37
请问怎么理解第3题中避免方法二,将分配内存的指针以链表形式管理,是指类似于堆区的使用new/delete的内存动态管理方法嘛
点赞 回复 分享
发布于 2021-08-03 09:18
请问申请堆内存里面的第三点通过传入一级指针不能解决是什么意思呢?
点赞 回复 分享
发布于 2023-09-12 22:44 上海
(3)通过传入一级指针不能解决,因为函数内部的指针将指向新的内存地址。这句是什么意思?不能解决什么呢?
点赞 回复 分享
发布于 06-20 21:05 辽宁
在函数中申请堆内存需要注意什么?的回答是不是有问题?感觉答非所问?
点赞 回复 分享
发布于 09-19 16:49 上海

相关推荐

起名字真难233:这名字一看就比什么上海寻梦信息技术有限公司,北京三快网络技术有限公司等高级不少
点赞 评论 收藏
分享
评论
11
1
分享
牛客网
牛客企业服务