C++ malloc 与 new 的区别
Posted 恋喵大鲤鱼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ malloc 与 new 的区别相关的知识,希望对你有一定的参考价值。
文章目录
C++ malloc 与 new 有什么区别?这是一道经典的面试题。
1.区别
下面我们就来看一下到底有哪些区别。
- 属性
new/delete 是 C++ 的操作符,而 malloc/free 是库函数。
- 参数
使用 malloc 为对象指针分配内存,要明确指定分配内存的大小,而 new 不需要,编译器会根据类型信息自行计算。
- 返回类型
new 分配内存成功,返回对象指针,无须进行类型转换;而 malloc 分配成功返回 void* 类型指针,需要通过强制类型转换将 void* 指针转换成我们需要的类型。
- 初始化(最大区别)
new 会先调用 operator new() 函数,申请足够的内存(通常底层使用 malloc 实现)。然后调用类型的构造函数,初始化成员变量,最后返回自定义类型指针。delete 先调用析构函数,然后调用 operator delete() 函数释放内存(通常底层使用 free 实现)。
malloc/free 是库函数,只能动态的申请和释放内存,无法强制要求其做自定义类型对象构造和析构工作。
- 重载
new 作为操作符,可以被重载,而 malloc 不行。
- 分配失败
new 如果分配内存失败会抛出 bad_alloc 异常;而 malloc 分配内存失败会返回 null 指针。
- 内存区域
new 操作符从自由存储区(free store)上为对象动态分配内存空间,而 malloc 函数从堆上动态分配内存。
自由存储区是 C++ 基于 new 操作符的一个抽象概念,凡是通过 new 操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C 语言使用 malloc 从堆上分配内存,使用 free 释放已分配的对应内存。自由存储区不等于堆,比如我们可以重载 operator new() 返回栈内存,然后调用 placement new() 在栈上初始化对象。
堆是一个实际的区域,而自由存储区是一个更上层的概念。通常 new 确实是在堆上申请内存,但是程序员可以自己重载 new 操作符,使用其他内存来实现自由存储(这并不常见)。另外,C++ Primer Plus 这本书上有提到 palcement new,可以为对象在栈上分配内存。总的来说,自由存储区是 new 申请内存时的概念。
2.小结
C++ malloc 与 new 有很多区别,最重要的是要答出“初始化”这个区别,这应该是面试官最想听到的回答。
参考文献
经典面试题之new和malloc的区别 - CSDN博客
C++ new 的三种面貌 - CSDN博客
C++ 自由存储区是否等价于堆? - melonstreet - 博客园
以上是关于C++ malloc 与 new 的区别的主要内容,如果未能解决你的问题,请参考以下文章