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 的区别的主要内容,如果未能解决你的问题,请参考以下文章

C++中new出得对象与C中的malloc出得有啥联系和区别?

C/C++——C++中new与malloc的10点区别

[转发]C++中new和malloc的区别

细说new与malloc的10点区别

细说new与malloc的10点区别

new 与malloc的区别