malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。new会自动调用构造函数,delete会自动调用析构函数,malloc和free不会。
malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
我们先看一看malloc/free和new/delete如何实现对象的动态内存管理,见下例。
classObj
{
public:
Obj(void){cout<<“Initialization”<<endl;}
~Obj(void){cout<<“Destroy”<<endl;}
voidInitialize(void){cout<<“Initialization”<<endl;}
voidDestroy(void){cout<<“Destroy”<<endl;}
};
voidUseMallocFree(void)
{
Obj*a=(obj*)malloc(sizeof(obj));//申请动态内存
a->Initialize();//初始化
//…
a->Destroy();//清除工作
free(a);//释放内存
}
voidUseNewDelete(void)
{
Obj*a=newObj;//申请动态内存并且初始化
//…
deletea;//清除并且释放内存
}
类Obj的函数Initialize模拟了构造函数的功能,函数Destroy模拟了析构函数的功能。函数UseMallocFree中,由于malloc/free不能执行构造函数与析构函数,必须调用成员函数Initialize和Destroy来完成初始化与清除工作。函数UseNewDelete则简单得多。
所以我们不要企图用malloc/free来完成动态对象的内存管理,应该用new/delete。由于内部数据类型的“对象”没有构造与析构的过程,对它们而言malloc/free和new/delete是等价的。
既然new/delete的功能完全覆盖了malloc/free,为什么C++不把malloc/free淘汰出局呢?这是因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。
malloc/free功能还有一好处,就是可以和realloc组合使用,在需要扩大内存块时不一定会导致内存移动;而用new/delete实现时只能用new[]-copy-delete[]操作序列完成,每次都会导致内存移动。
简而言之:
new 是一个操作符,可以重载
malloc是一个函数,可以覆盖
new 初始化对象,调用对象的构造函数,对应的delete调用相应的析构函数
malloc仅仅分配内存,free仅仅回收内存
分享到:
相关推荐
本文将深入探讨两种常见的动态内存管理方法:`malloc/free` 和 `new/delete` 的区别与联系。这两种方法虽然都能用于动态内存的申请与释放,但在细节上有着显著的不同。 #### 二、`malloc/free` 详解 - **定义**:`...
本篇文章将深入探讨C++中的`new/delete`和C语言中的`malloc/free`这两种动态内存管理方式,以及它们之间的区别。 首先,`malloc/free`是C/C++标准库提供的函数,用于在运行时动态分配和释放内存。`malloc(size_t ...
"new与delete和malloc与free之间的关系与区别" 在C++编程语言中,new和delete是C++的关键字,是一种操作符,可以被重载,而malloc和free是C语言的库函数,并且不能重载。这两对函数都是用于内存管理的,但是它们...
一般来说,在C/C++的面试时,对于new/delete和malloc/free这两对的使用和区别经常被考查到,如果这种基础的问题都答不上来,估计很难过面试了。本文即是对new/delete和malloc/free这两对的使用和区别较为简单的分析...
在实际开发中,malloc/free和new/delete都可以用于动态内存管理,但是它们有着不同的应用场景和用途。malloc/free通常用于C语言和C++语言混合编程环境中,而new/delete则更适合纯C++语言开发环境。同时,new/delete...
与 Malloc 和 Free 不同,New 和 Delete 是编译器级别的特性,而非库函数。 #### 二、动态内存分配与初始化 对于 C++ 中的数据结构或对象来说,仅使用 Malloc 和 Free 无法完全满足需求。具体原因如下: 1. **...
C++中new和malloc的区别 C++是一种支持面向对象编程的高级语言,其内存管理机制允许程序员在运行时动态分配和释放内存。在C++中,动态内存分配主要通过new和delete运算符实现,而C语言中主要使用malloc和free函数。...
在C++中,new和delete是用于动态内存分配和释放的标准运算符,它们基于C语言的malloc和free实现。然而,对于某些对象,如果它们的创建和销毁非常频繁,使用全局的new和delete可能会导致性能瓶颈。这是因为全局new和...
C++动态内存分配(new/new[]和delete/delete[])详解 为了解决这个普通的编程问题,在运行时能创建和销毁对象是基本的要求。当然,C已提供了动态内存分配函数malloc( )和free( ),以及malloc( )的变种(realloc:改变...
在C++编程中,全局`new`和`delete`操作符是用于动态内存分配和释放的关键部分。有时候,为了满足特定需求,如内存池管理、内存跟踪、异常安全或者资源的特殊处理,开发者可能需要重写这些全局操作符。本文将深入探讨...
默认情况下,C++使用标准库提供的`new`和`delete`运算符来分配和释放动态内存。然而,有时我们需要对内存管理进行更精细的控制,例如在多线程环境中保证线程安全,或者优化内存分配性能。这时,我们可以自定义`new`...
首先,`new`和`delete`是C++中的运算符,而`malloc`和`free`是C/C++标准库中的函数。`new`不仅分配内存,还会根据需要调用对象的构造函数,而`malloc`只负责分配内存,不处理对象的构造和析构。当涉及非内置数据类型...
在C/C++编程中,内存管理是至关重要的一个环节,其中`malloc`和`free`是C语言标准库提供的函数,而`new`和`delete`是C++中的运算符,它们都用于动态内存的分配和释放。虽然两者在功能上有相似之处,但在使用和功能上...
C++面试经常会问到关于malloc/free和new/delete的区别,网上有不同版本的解释,这里总结下并加上个人理解和使用。 两者相同点 1.都可以申请动态堆内存。 两者不同点 1.new/delete是C++的操作符,malloc/free是C/...
而C++则通过关键字new和delete来实现这一功能,它们与C语言中的malloc和free既有相似之处也有明显的区别。本文将对malloc和new的区别进行详细解读,包括它们的属性、参数、返回类型、自定义类型处理、内存区域、分配...
### C++中的new/delete与malloc/free的区别 #### 一、基本概念 在C++中,内存分配是一项重要的任务。为了实现这一目标,C++提供了多种方法来管理内存,包括`new`/`delete`和`malloc`/`free`。 #### 二、new/...
通过实例代码,我们可以看到new和malloc的区别,delete和free的区别,以及构造函数和析构函数的调用。这些知识点对于C++程序员来说是非常重要的,需要牢固掌握这些概念,以便更好地使用C++语言。