`
wuhenliushui
  • 浏览: 17695 次
社区版块
存档分类
最新评论

new/delete和malloc/free的区别

 
阅读更多

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` 和 `new/delete` 的区别与联系。这两种方法虽然都能用于动态内存的申请与释放,但在细节上有着显著的不同。 #### 二、`malloc/free` 详解 - **定义**:`...

    深入理解C++中的new/delete和malloc/free动态内存管理及区别介绍

    本篇文章将深入探讨C++中的`new/delete`和C语言中的`malloc/free`这两种动态内存管理方式,以及它们之间的区别。 首先,`malloc/free`是C/C++标准库提供的函数,用于在运行时动态分配和释放内存。`malloc(size_t ...

    11_new&delete与malloc&free 之间的关系与区别1

    "new与delete和malloc与free之间的关系与区别" 在C++编程语言中,new和delete是C++的关键字,是一种操作符,可以被重载,而malloc和free是C语言的库函数,并且不能重载。这两对函数都是用于内存管理的,但是它们...

    C++中new与delete、malloc与free应用分析

    一般来说,在C/C++的面试时,对于new/delete和malloc/free这两对的使用和区别经常被考查到,如果这种基础的问题都答不上来,估计很难过面试了。本文即是对new/delete和malloc/free这两对的使用和区别较为简单的分析...

    malloc和new的区别

    在实际开发中,malloc/free和new/delete都可以用于动态内存管理,但是它们有着不同的应用场景和用途。malloc/free通常用于C语言和C++语言混合编程环境中,而new/delete则更适合纯C++语言开发环境。同时,new/delete...

    Malloc和new区别

    与 Malloc 和 Free 不同,New 和 Delete 是编译器级别的特性,而非库函数。 #### 二、动态内存分配与初始化 对于 C++ 中的数据结构或对象来说,仅使用 Malloc 和 Free 无法完全满足需求。具体原因如下: 1. **...

    C++中new和malloc的区别

    C++中new和malloc的区别 C++是一种支持面向对象编程的高级语言,其内存管理机制允许程序员在运行时动态分配和释放内存。在C++中,动态内存分配主要通过new和delete运算符实现,而C语言中主要使用malloc和free函数。...

    定制new / delete的性能分析

    在C++中,new和delete是用于动态内存分配和释放的标准运算符,它们基于C语言的malloc和free实现。然而,对于某些对象,如果它们的创建和销毁非常频繁,使用全局的new和delete可能会导致性能瓶颈。这是因为全局new和...

    C++动态内存分配(new/new[]和delete/delete[])详解

    C++动态内存分配(new/new[]和delete/delete[])详解 为了解决这个普通的编程问题,在运行时能创建和销毁对象是基本的要求。当然,C已提供了动态内存分配函数malloc( )和free( ),以及malloc( )的变种(realloc:改变...

    重写全局new/delete示例

    在C++编程中,全局`new`和`delete`操作符是用于动态内存分配和释放的关键部分。有时候,为了满足特定需求,如内存池管理、内存跟踪、异常安全或者资源的特殊处理,开发者可能需要重写这些全局操作符。本文将深入探讨...

    自定义数据new/delete源码

    默认情况下,C++使用标准库提供的`new`和`delete`运算符来分配和释放动态内存。然而,有时我们需要对内存管理进行更精细的控制,例如在多线程环境中保证线程安全,或者优化内存分配性能。这时,我们可以自定义`new`...

    new与malloc 的区别和用法

    首先,`new`和`delete`是C++中的运算符,而`malloc`和`free`是C/C++标准库中的函数。`new`不仅分配内存,还会根据需要调用对象的构造函数,而`malloc`只负责分配内存,不处理对象的构造和析构。当涉及非内置数据类型...

    c/c++ mallocfree newdelete 区别

    在C/C++编程中,内存管理是至关重要的一个环节,其中`malloc`和`free`是C语言标准库提供的函数,而`new`和`delete`是C++中的运算符,它们都用于动态内存的分配和释放。虽然两者在功能上有相似之处,但在使用和功能上...

    C++中malloc与free、new与delete的详解与应用

    C++面试经常会问到关于malloc/free和new/delete的区别,网上有不同版本的解释,这里总结下并加上个人理解和使用。 两者相同点 1.都可以申请动态堆内存。 两者不同点 1.new/delete是C++的操作符,malloc/free是C/...

    malloc 与new的区别

    而C++则通过关键字new和delete来实现这一功能,它们与C语言中的malloc和free既有相似之处也有明显的区别。本文将对malloc和new的区别进行详细解读,包括它们的属性、参数、返回类型、自定义类型处理、内存区域、分配...

    C++与操作系统等面试题17

    ### C++中的new/delete与malloc/free的区别 #### 一、基本概念 在C++中,内存分配是一项重要的任务。为了实现这一目标,C++提供了多种方法来管理内存,包括`new`/`delete`和`malloc`/`free`。 #### 二、new/...

    C++中的new/delete、构造/析构函数、dynamic_cast分析

    通过实例代码,我们可以看到new和malloc的区别,delete和free的区别,以及构造函数和析构函数的调用。这些知识点对于C++程序员来说是非常重要的,需要牢固掌握这些概念,以便更好地使用C++语言。

Global site tag (gtag.js) - Google Analytics