由于编程的习惯,动态管理内存的时候总是用new/delete,malloc/free很少使用,两者之间的区别就不是很清楚了。
1. 本质区别
malloc/free是C/C++语言的标准库函数,new/delete是C++的运算符。
对
于用户自定义的对象而言,用maloc/free无法满足动态管理对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。
由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此
C++需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。
class
Obj
{
public
:
Obj(
) { cout
<<
“Initialization”
<<
endl; }
~
Obj(
) { cout
<<
“Destroy”
<<
endl; }
void
Initialize(
) { cout
<<
“Initialization”
<<
endl; }
void
Destroy(
) { cout
<<
“Destroy”
<<
endl; }
};
void
UseMallocFree(
)
{
Obj
*
a
=
(obj
*
) malloc(
sizeof
( obj ) );
//
allocate memory
a
->
Initialize();
//
initialization
//
…
a
->
Destroy();
// deconstruction
free(a); // release memory
}
void
UseNewDelete(
void
)
{
Obj
*
a
=
new
Obj;
//
…
delete a;
}
类Obj的函数Initialize实现了构造函数的功能,函数Destroy实现了析构函数的功能。函数UseMallocFree中,
由于malloc/free不能执行构造函数与析构函数,必须调用成员函数Initialize和Destroy来完成“构造”与“析构”。所以我们不要
用malloc/free来完成动态对象的内存管理,应该用new/delete。由于内部数据类型的“对象”没有构造与析构的过程,对它们而言
malloc/free和new/delete是等价的。
2. 联系
既然new/delete的功能完全覆盖了malloc
/free,为什么C++还保留malloc/free呢?因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。如果用
free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放“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具有以下优点: 1. 可以自动执行对象的构造函数和析构函数,以满足非内部数据类型的对象需求。 2. 可以更好地管理动态内存,避免内存泄露和野指针等问题。 3. 可以简化编程,提高开发...
在C++中,new和delete是用于动态内存分配和释放的标准运算符,它们基于C语言的malloc和free实现。然而,对于某些对象,如果它们的创建和销毁非常频繁,使用全局的new和delete可能会导致性能瓶颈。这是因为全局new和...
与 Malloc 和 Free 不同,New 和 Delete 是编译器级别的特性,而非库函数。 #### 二、动态内存分配与初始化 对于 C++ 中的数据结构或对象来说,仅使用 Malloc 和 Free 无法完全满足需求。具体原因如下: 1. **...
C++动态内存分配(new/new[]和delete/delete[])详解 为了解决这个普通的编程问题,在运行时能创建和销毁对象是基本的要求。当然,C已提供了动态内存分配函数malloc( )和free( ),以及malloc( )的变种(realloc:改变...
在C++编程中,全局`new`和`delete`操作符是用于动态内存分配和释放的关键部分。有时候,为了满足特定需求,如内存池管理、内存跟踪、异常安全或者资源的特殊处理,开发者可能需要重写这些全局操作符。本文将深入探讨...
C++中new和malloc的区别 C++是一种支持面向对象编程的高级语言,其内存管理机制允许程序员在运行时动态分配和释放内存。在C++中,动态内存分配主要通过new和delete运算符实现,而C语言中主要使用malloc和free函数。...
- **匹配规则**:数组版本的`new[]`应与`delete[]`匹配,非数组版本的`new`应与`delete`匹配。 - **兼容性**:自定义的`new`和`delete`应与C++标准库中的其他组件兼容。 通过自定义`new`和`delete`,我们可以更有效...
在C++程序中使用`new`和`delete`能够更好地与C++的其他特性(如构造函数、析构函数、异常处理等)协同工作,而`malloc`和`free`更适合于纯C代码或需要与C库交互的情况。 总结一下,`new`和`malloc`的主要区别在于:...
C++面试经常会问到关于malloc/free和new/delete的区别,网上有不同版本的解释,这里总结下并加上个人理解和使用。 两者相同点 1.都可以申请动态堆内存。 两者不同点 1.new/delete是C++的操作符,malloc/free是C/...
在C/C++编程中,内存管理是至关重要的一个环节,其中`malloc`和`free`是C语言标准库提供的函数,而`new`和`delete`是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++语言。