✍个人博客:Pandaconda-CSDN博客
📣专栏地址:http://t.csdnimg.cn/fYaBd
📚专栏简介:在这个专栏中,我将会分享 C++ 面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪
10. 讲解 一下溢出原理
堆栈溢出是说堆区和栈区的溢出,二者同属于缓冲区溢出。从上面关于堆区和栈区的解释可以看出,一旦程序确定,堆栈内存空间的大小就是固定的,当数据已经把堆栈的空间占满时,再往里面存放数据就会超出容量,发生上溢;当堆栈中的已经没有数据时,再取数据就无法取到了,发生下溢。需要注意的是,栈分为顺序栈和链栈,链栈不会发生溢出,顺序栈会发生溢出。
11. 可以手动在栈上分配内存吗?
不行,栈上的内存分配都是由操作系统自动完成的。但是我们可以通过 ulimit 来查看栈的默认大小,通过 ulimit -s 来改变默认大小。
12. new / 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 采用的是内存池的管理方式,以减少内存碎片。先申请大块内存作为堆区,然后将堆区分为多个内存块。当用户申请内存时,直接从堆区分配一块合适的空闲块。采用隐式链表将所有空闲块,每一个空闲块记录了一个未分配的、连续的内存地址。