【C++ 面试 - 内存管理】每日 3 题(六)

✍个人博客:Pandaconda-CSDN博客

📣专栏地址:http://t.csdnimg.cn/fYaBd

📚专栏简介:在这个专栏中,我将会分享 C++ 面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

16. malloc 申请的内存存储在哪个地方?

动态内存分配的地址存储在堆中。

堆(heap):堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用 malloc 等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用 free 等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)。

除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进先出特点,所以栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。

17. mmap 的作用 

​​​​​​​ 

mmap 函数第一种用法是映射磁盘文件到内存中;而 malloc 使用的 mmap 函数的第二种用法,即匿名映射,匿名映射不映射磁盘文件,而是向映射区申请一块内存。munmap 函数是用于释放内存,第一个参数为内存首地址,第二个参数为内存的长度。接下来看下 mmap 函数的参数。

当申请小内存的时,malloc 使用 sbrk 分配内存;当申请大内存时,使用 mmap 函数申请内存。但是这只是分配了虚拟内存,还没有映射到物理内存,当访问申请的内存时,才会因为缺页异常,内核分配物理内存。

18. new 的底层实现是如何实现的?

new 底层实现:关键字 new 在调用构造函数的时候实际上进行了如下的几个步骤:

  1. 创建一个新的对象

  2. 将构造函数的作用域赋值给这个新的对象(因此 this 指向了这个新的对象)

  3. 执行构造函数中的代码(为这个新对象添加属性)

  4. 返回新对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值