面试题积累_03

1

const关键字与宏定义的区别是什么?

答:
const常量具有类型,编译器可以进行安全检查,一旦出现bug,在编译阶段就可以发现。而宏定义发生在预处理阶段,它只是进行简单的字符串替换 ,一旦出现bug,可能在运行时才知道。

2

malloc的底层实现是怎样的?free是怎么回收内存的?

答:
当开辟的空间小于 128k 时,malloc 的底层是通过系统调用函数 brk() 来实现。

当开辟的空间大于 128k 时,malloc 的底层是通过系统调用函数 mmap() 来实现。

在动态分配内存时,存在一个指向堆顶的指针,brk分配的内存需要等到高地址内存释放以后才能释放,而mmap分配的内存可以单独释放。如果低地址内存在高地址内存之前free,则只是在逻辑上释放,并没有真正的释放,如果此时再有一个低地址内存大小的申请,那么malloc很可能会将低地址这块内存重新复用。

3

new/delete与malloc/free的区别与联系是什么?

答:

  1. new分配内存按照数据类型进行分配,malloc分配内存按照指定的大小分配;

  2. new返回的是指定对象的指针,而malloc返回的是void*,因此malloc的返回值一般都需要进行类型转化。

  3. new不仅分配一段内存,而且会调用构造函数,malloc不会。

  4. new分配的内存要用delete销毁,malloc要用free来销毁;delete销毁的时候会调用对象的析构函数,而free则不会。

  5. new是一个操作符可以重载,malloc是一个库函数。

  6. malloc分配的内存不够的时候,可以用realloc扩容。扩容的原理?new没有这样的操作。

  7. new如果分配失败了会抛出bad_malloc的异常,而malloc失败了会返回NULL。

  8. 申请数组时: new[]一次分配所有内存,多次调用构造函数,搭配使用delete[],delete[]多次调用析构函数,销毁数组中的每个对象。而malloc则只能用sizeof(int) * n。

  9. malloc/free是属于C语言中的库函数,而new/delete是C++中的库函数。

4

内存泄漏、内存溢出、内存踩踏、野指针?

答:
内存溢出就是你要的内存空间超过了系统实际分配给你的空间,此时系统相当于没法满足你的需求,就会报内存溢出的错误。
内存溢出原因:

  1. 内存中加载的数据量过于庞大,如一次从数据库取出过多数据集合类中有对对象的引用,使用完后未清空,使得不能回收

  2. 代码中存在死循环或循环产生过多重复的对象实体

内存泄漏是指由于疏忽或错误造成了程序未能释放掉不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。
内存泄漏的分类:

  1. 堆内存泄漏 (Heap leak)。堆内存指的是程序运行中根据需要分配通过malloc,realloc new等从堆中分配的一块内存,再是完成后必须通过调用对应的 free或者delete 删掉。如果程序的设计的错误导致这部分内存没有被释放,那么此后这块内存将不会被使用,就会产生Heap Leak。

  2. 系统资源泄露(Resource Leak)。主要指程序使用系统分配的资源比如 Bitmap,handle ,SOCKET等没有使用相应的函数释放掉,导致系统资源的浪费,严重可导致系统效能降低,系统运行不稳定。

  3. 没有将基类的析构函数定义为虚函数。当基类指针指向子类对象时,如果基类的析构函数不是virtual,那么子类的析构函数将不会被调用,子类的资源没有正确是释放,因此造成内存泄露

posted @ 2023-03-23 14:34  MyXjl  阅读(11)  评论(0编辑  收藏  举报