文章目录
问题1:new和malloc有什么区别?
- 是否可以被重载覆盖:
malloc和free是标准库函数,支持覆盖;
new和delete是运算符,不重载。
- 是否调用构造函数/析构函数:
malloc仅仅分配内存空间,free仅仅回收空间,不具备调用构造函数和析构函数功能,用malloc分配空间存储类的对象存在风险;
new和delete除了分配回收功能外,还会调用构造函数和析构函数。
- 返回类型:
malloc和free返回的是void类型指针(必须进行类型转换);
new和delete返回的是具体类型指针。
- 内存分配失败时的返回值:
new内存分配失败时,会抛出bac_alloc异常,它不会返回NULL;
malloc分配内存失败时返回NULL。
- 是否需要指定内存大小:
使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算;
malloc则需要显式地指出所需内存的尺寸。
- 对数组的处理:
C++提供了new[]与delete[]来专门处理数组类型,new对数组的支持体现在它会分别调用构造函数函数初始化每一个数组元素,释放对象时为每个对象调用析构函数。
至于malloc,它并知道你在这块内存上要放的数组还是啥别的东西,反正它就给你一块原始的内存,在给你个内存的地址就完事。所以如果要动态分配一个数组的内存,还需要我们手动自定数组的大小:
问题2:new和delete是如何实现的?
- new的实现过程是:首先调用名为operator new的标准库函数,分配足够大的原始为类型化的内存,以保存指定类型的一个对象;接下来运行该类型的一个构造函数,用指定初始化构造对象;最后返回指向新分配并构造后的的对象的指针。
- delete的实现过程:对指针指向的对象运行适当的析构函数;然后通过调用名为operator delete的标准库函数释放该对象所用内存
问题3:还有一个placement new知道么?
使用new操作符分配内存需要在堆中查找足够大的剩余空间,显然这个操作速度是很慢的,而且有可能出现无法分配内存的异常(空间不够)。placement new就可以解决这个问题。我们构造对象都是在一个预先准备好了的内存缓冲区中进行,不需要查找内存,内存分配的时间是常数;而且不会出现在程序运行中途出现内存不足的异常。所以,placement new非常适合那些对时间要求比较高,长时间运行不希望被打断的应用程序。
简而言之:保持一块内存,反复构造析构,这样可以省略中间的多次分配内存。
问题4:被free回收的内存是立即返还给操作系统吗?
不是的,被free回收的内存会首先被ptmalloc使用双链表保存起来,当用户下一次申请内存的时候,会尝试从这些内存中寻找合适的返回。这样就避免了频繁的系统调用,占用过多的系统资源。同时ptmalloc也会尝试对小块内存进行合并,避免过多的内存碎片。
notice:
以上内容整理自:
全面解析C++中的new,operator new与placement new
c++ new 与malloc有什么区别
阿秀的校招笔记
C++面经汇总(CVTE、腾讯等)