参考资料:
[1]程序员面试笔记 第12章 内存管理
12.1堆内存与栈内存
好好看一遍就不难了!!!
栈存储区:主要存储函数参数和局部变量
堆存储区:主要存储动态分配的内存块
全局及静态存储区:主要存储全局变量和静态变量
常量存储区:又称字符串常量区,用于存放字符串常量
面试题1:简述程序中的4个存储区
无论指针指向那个存储区,指针变量本质都保存在栈存储区
面试题2:简述栈空间和堆空间的区别
栈存储区:主要存储函数参数和局部变量
堆存储区:主要存储动态分配的内存块
栈空间默认大小只有几兆的空间,向着内存地址减小的方向消耗空间。
堆理论上有几个G的空间,向着内存地址增大的方向消耗空间。
面试题3:简述递归程序存在的风险
递归层数过深,会造成栈溢出。
原则上任何递归都可以采用循环实现,虽然使用循环会造成代码变长,可读性降低,但是避免了栈溢出的问题。
12.2内存泄漏
(1)后果:如果没有对已经不用的内存进行释放,随着程序运行时间的加长,泄漏的内存越积越多,可用的内存越来越少,最终无法为程序分配新的内存,导致程序崩溃。
(2)原因:内存泄漏是由于程序使用malloc或者new在堆中申请了一块空间,但是后来并没有调用free或者delete释放造成的。
面试题1:预防内存泄漏的方法
(1)使用智能指针代替普通指针,智能指针自动调用析构函数释放空间。
(2)保证malloc和free、new 和delete成对出现。
面试题2:找出不容易察觉的内存泄漏
注意:如果动态分配的数组元素是基本类型的话,那么通过delete和delete[]释放空间是等价的。如果动态分配的数组元素时自定义的类型的话,那么得通过delete[]释放空间,如果使用delete,只会删除数组空间中的首元素。
12.2内存泄漏
内存越界又称内存访问越界,是指访问了申请空间之外的内存。
面试题1:访问vector元素时的越界问题
通过下标运算符[]访问vector元素时不会做边界检查,程序也不会报错,返回的是这个地址上的值。为了进行边界检测,可以使用vector中的at函数。