欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 新车 > 【C++ 面试 - 内存管理】每日 3 题(四)

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

2024/10/24 16:30:19 来源:https://blog.csdn.net/Newin2020/article/details/141612902  浏览:    关键词:【C++ 面试 - 内存管理】每日 3 题(四)

✍个人博客:Pandaconda-CSDN博客

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

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

10. 讲解 一下溢出原理

堆栈溢出是说堆区和栈区的溢出,二者同属于缓冲区溢出。从上面关于堆区和栈区的解释可以看出,一旦程序确定,堆栈内存空间的大小就是固定的,当数据已经把堆栈的空间占满时,再往里面存放数据就会超出容量,发生上溢;当堆栈中的已经没有数据时,再取数据就无法取到了,发生下溢。需要注意的是,栈分为顺序栈和链栈,链栈不会发生溢出,顺序栈会发生溢出。

11. 可 以手动在栈上分配内存吗?

不行,栈上的内存分配都是由操作系统自动完成的。但是我们可以通过 ulimit 来查看栈的默认大小,通过 ulimit -s 来改变默认大小。

12. n ew / delete 与 malloc / free 的异同

相同点

  • 都可用于内存的动态申请和释放。

不同点

  • 前者是 C++ 运算符,后者是 C/C++ 语言标准库函数。

  • new 自动计算要分配的空间大小,malloc 需要手工计算。malloc 需要给定申请内存的大小,返回的指针需要强转;new 会调用构造函数,不用指定内存的大小,返回指针不用强转。

  • new 是类型安全的,malloc 不是。例如:

int *p = new float[2]; //编译错误
int *p = (int*)malloc(2 * sizeof(double));//编译无错误
  • new 调用名为 operator new 的标准库函数分配足够空间并调用相关对象的构造函数,delete 对指针所指对象运行适当的析构函数;然后通过调用名为 operator delete 的标准库函数释放该对象所用内存。后者均没有相关调用。

  • 后者需要库文件支持,前者不用。

  • new 是封装了 malloc,直接 free 不会报错,但是这只是释放内存,而不会析构对象。

  • new 发生错误抛出异常,malloc 返回 null。

答案解析

malloc 底层实现:当开辟的空间小于 128K 时,调用 sbrk() 函数;当开辟的空间大于 128K 时,调用 mmap()。malloc 采用的是内存池的管理方式,以减少内存碎片。先申请大块内存作为堆区,然后将堆区分为多个内存块。当用户申请内存时,直接从堆区分配一块合适的空闲块。采用隐式链表将所有空闲块,每一个空闲块记录了一个未分配的、连续的内存地址。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com