Malloc和new区别
1 ,malloc 与free 是C++/C 语言的标准库函数,new/delete 是C++ 的运算符。它们都可用于申请动态内存和释放内存。 2 ,对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡 之前要自动执行析构函数。由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的 任务强加于malloc /free. 3 ,因此C++ 语言需要一个能完成动态内存分配和初始化工作的运算符new ,以一个能完成清理与释放内存工作的运算符delete.注意ne w/delete 不是库函数。 4 ,C++ 程序经常要调用C函数,而C 程序只能用malloc/free 管理动态内存 new 是个操作符,和什么"+","-","="……有一样的地 ### Malloc和New的区别 #### 一、基本概念与功能 **Malloc** 与 **Free** 是 C/C++ 语言中的标准库函数,主要用于动态内存的分配与释放。这两个函数定义在 `<cstdlib>`(或 `<malloc.h>`)库中。 **New** 与 **Delete** 是 C++ 语言中的关键字,作为运算符使用,用于动态内存的分配与释放。与 Malloc 和 Free 不同,New 和 Delete 是编译器级别的特性,而非库函数。 #### 二、动态内存分配与初始化 对于 C++ 中的数据结构或对象来说,仅使用 Malloc 和 Free 无法完全满足需求。具体原因如下: 1. **构造函数与析构函数**:当创建一个非内部数据类型(如自定义类的对象)时,需要调用构造函数来初始化对象;当对象不再使用时,则需调用析构函数来清理资源。由于 Malloc 和 Free 只负责内存的分配与释放,并不涉及对象的构造或析构,因此不适合用于这类对象的管理。 2. **初始化**:New 运算符不仅能够分配内存,还会自动调用构造函数来初始化对象,从而确保对象处于有效状态。Delete 运算符则会在释放内存前调用析构函数,以清理可能占用的资源。这是 New 和 Delete 相比 Malloc 和 Free 的一大优势。 #### 三、C++与C之间的互操作性 在实际开发中,C++ 程序经常需要调用 C 函数。由于 C 语言中没有类似 New 和 Delete 的机制,因此 C 程序通常使用 Malloc 和 Free 来管理动态内存。这意味着,在 C++ 程序中与 C 代码交互时,如果涉及到动态内存的分配与释放,通常需要采用 Malloc 和 Free。 #### 四、关键字与函数的区别 - **New** 作为 C++ 中的一个保留关键字,无需包含特定的头文件即可使用。 - **Malloc** 需要通过包含 `<cstdlib>` 或 `<malloc.h>` 头文件来获得支持。 #### 五、内存分配与访问方式 - **New** 建立的是一个对象,可以直接通过对象的方式来访问其成员变量和方法,而不仅仅是通过指针访问内存。 - **Malloc** 分配的只是一块内存区域,通常需要通过指针来访问这块内存,并且可以在内存中移动指针。 #### 六、其他区别 - **New** 可以重载,这意味着可以根据需要定义不同的行为。 - **Malloc** 是一个函数,可以通过函数覆盖的方式实现不同版本的行为。 - **New** 在分配内存时会自动调用对象的构造函数进行初始化,而 Malloc 仅负责分配内存,不涉及任何初始化过程。 - **Delete** 在释放内存前会调用对象的析构函数进行必要的清理工作,而 Free 仅释放内存而不调用任何清理函数。 #### 七、New 表达式的三种形式 1. **单个对象的动态分配**:例如 `int *pi = new int(11);` 这里 `new int(11)` 是初始化操作,而 `new int;` 只是简单地分配内存。 2. **数组的动态分配**:例如 `int *pi = new int[11];` 分配了一个包含 11 个整数的数组。 3. **定位 New 表达式**:这种形式允许用户指定内存的起始位置,例如 `int *buf = new int[2]; int *pb = new (buf) int;`。这里 `new (buf) int;` 指定了 `buf` 的起始位置作为新对象的存储位置。 #### 八、总结 在 C++ 中,**New** 和 **Delete** 更适用于对象的管理,提供了构造和析构的功能,使代码更加安全和高效。而 **Malloc** 和 **Free** 则更多地应用于 C 程序或者对内存管理有特殊需求的情况。了解这些基本概念有助于开发者更好地选择适合的内存管理方式,提高程序的性能和稳定性。