new delete和malloc free的区别

1、new 是c++中的操作符,malloc是c 中的一个函数

2、new 不止是分配内存,而且会调用类的构造函数,同理delete会调用类的析构函数,而malloc则只分配内存,不会进行初始化类成员的工作,同样free也不会调用析构函数

3、内存泄漏对于malloc或者new都可以检查出来的,区别在于new可以指明是那个文件的那一行,而malloc没有这些信息。

4.new可以看成两个动作:1。分配内存(相当于malloc)2。引发构造函数。

new   是个操作符,和什么"+","-","="...有一样的地位.

malloc是个分配内存的函数,供你调用的.

new是保留字,不需要头文件支持.

malloc需要头文件库函数支持.

new   建立的是一个对象,

malloc分配的是一块内存.

new建立的对象你可以把它当成一个普通的对象,用成员函数访问,不要直接访问它的地址空间

malloc分配的是一块内存区域,就用指针访问好了,而且还可以在里面移动指针.

5、new 和 malloc效率比较

new 有三个字母, malloc有六个字母

new可以认为是malloc加构造函数的执行。

new出来的指针是直接带类型信息的。

而malloc返回的都是void指针。

一: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如何实现对象的动态内存管理,见示例。


class Obj

{

public :

Obj(void){ cout << “Initialization” << endl; }

~Obj(void){ cout << “Destroy” << endl; }

void      Initialize(void){ cout << “Initialization” << endl; }

void      Destroy(void){ cout << “Destroy” << endl; }

};


void UseMallocFree(void)

{

Obj    *a = (obj *)malloc(sizeof(obj));     // 申请动态内存

a->Initialize();                          // 初始化

//…

a->Destroy();     // 清除工作

free(a);          // 释放内存

}


void UseNewDelete(void)

{

Obj    *a = new Obj;    // 申请动态内存并且初始化

//…

delete a;             // 清除并且释放内存

}

示例用malloc/free和new/delete如何实现对象的动态内存管理

类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管理动态内存。

如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放“malloc申请的动态内存”,理论上讲程序不会出错,但是该程序的可读性很差。所以new/delete必须配对使用,malloc/free也一样。

二:new delete在实现上其实调用了malloc,free函数。

三:new operator除了分配内存,还要调用构造函数。

malloc函数只是负责分配内存。

<think>好的,我现在需要回答用户关于C++中new/deletemalloc/free区别的问题。首先,我得回忆一下之前学过的相关知识,并结合提供的引用内容来整理答案。用户已经给出四个引用资料,我需要仔细理解这些内容,确保回答准确。 首先,用户的问题是关于new/freemalloc/delete之间的区别。不过,根据常规用法,正确的配对是new/deletemalloc/free。可能用户在这里有点混淆,需要明确指出正确的配对方式,并解释为什么不能混用。比如,用new分配的内存应该用delete释放,而malloc分配的内存用free释放,否则可能导致问题。 接下来,根据引用资料,我需要整理出主要的区别点。引用[1]引用[2]都提到了几个关键点:比如malloc/free是函数,而new/delete是操作符;malloc不初始化内存,new会调用构造函数;返回类型计算大小方面的差异;以及失败时的处理方式不同(返回NULL vs 抛出异常)等。引用[4]还提到了newdelete在底层可能调用mallocfree,但会处理构造函数析构函数。 我需要将这些点分门别类,结构清晰地呈现出来。比如可以分为操作符与函数、内存初始化、类型安全、失败处理、构造析构函数的调用等方面。同时,要注意用户提到的混用情况,比如用free释放new出来的内存或用delete释放malloc分配的内存是否可行,这样会有什么后果。 另外,用户提供的示例中引用了多个资料,我需要正确标注引用来源,比如在提到构造析构函数时引用[1]、[2]、[4],在提到类型大小计算时引用[2],等等。引用标识要自然地加在相关段落的末尾,避免干扰阅读。 可能还需要举一些例子,比如代码片段,说明正确的使用方式,以及混用时的问题。例如,用malloc分配一个对象,然后尝试用delete释放,这样不会调用析构函数,可能导致资源泄漏。或者用new分配数组,用free释放,导致未调用析构函数等问题。 另外,用户的问题中可能存在一个误区,即new/freemalloc/delete的组合是否存在。需要明确指出正确的配对,并解释混用的风险。比如,new应该与delete搭配,mallocfree搭配,否则可能导致未定义行为。 还需要考虑回答的结构是否清晰,按照逻辑顺序分点说明,每个点用标题或编号突出,便于用户理解。同时,在回答最后生成相关问题,帮助用户进一步学习,比如关于内存管理的最佳实践,或者如何避免内存泄漏等。 最后,确保使用中文回答,数学公式代码块格式正确。例如,如果有涉及内存大小的计算,可能需要使用行内公式,如$sizeof(int)$,但根据用户提供的示例,可能不需要太多数学公式,重点在代码文字描述。 总结步骤: 1. 确定用户的问题核心,纠正可能的误区(new/delete vs malloc/free的正确配对)。 2. 根据引用资料整理主要区别点,分点详细说明。 3. 加入代码示例说明正确错误用法。 4. 标注引用来源,确保每个引用标识对应正确的内容。 5. 生成相关问题,促进深入学习。</think>### C++中new/deletemalloc/free区别 在C++中,`new/delete``malloc/free`是两套不同的内存管理机制,它们的核心差异体现在**功能定位**、**类型安全****对象生命周期管理**上。以下是主要区别: --- #### 1. **操作符 vs 函数** - **`new/delete`** 是C++的**操作符**,由编译器直接支持[^2]。 - **`malloc/free`** 是C/C++标准库提供的**函数**,需要包含头文件`<cstdlib>`[^1][^2]。 --- #### 2. **内存分配与初始化** - **`malloc`** 仅分配指定大小的内存,**不调用构造函数**,返回`void*`需手动类型转换[^1][^2]。 ```cpp int* p = (int*)malloc(sizeof(int)); // 未初始化 ``` - **`new`** 分配内存后**自动调用构造函数**,返回类型正确的指针[^1][^4]。 ```cpp int* p = new int(10); // 初始化为10 ``` --- #### 3. **类型安全与大小计算** - **`malloc`** 需手动计算内存大小(如`sizeof(int)*10`),容易出错。 - **`new`** 自动计算类型大小,支持数组分配[^4]。 ```cpp int* arr = new int[10]; // 自动计算总大小 ``` --- #### 4. **错误处理** - **`malloc`** 失败返回`NULL`,需显式检查[^2]。 - **`new`** 失败抛出`std::bad_alloc`异常,可通过`nothrow`版避免异常[^2]。 ```cpp int* p = new (std::nothrow) int[100]; // 失败返回nullptr ``` --- #### 5. **对象生命周期管理** - **`new/delete`** 管理**对象生命周期**: - `new`调用构造函数完成初始化[^4]。 - `delete`调用析构函数释放资源[^1][^4]。 ```cpp class MyClass {...}; MyClass* obj = new MyClass(); // 调用构造函数 delete obj; // 调用析构函数 ``` - **`malloc/free`** 仅操作内存,不涉及对象构造/析构[^1][^4]。 ```cpp MyClass* obj = (MyClass*)malloc(sizeof(MyClass)); // 未构造对象 free(obj); // 未调用析构函数,可能导致资源泄漏 ``` --- #### 6. **混用的风险** - **`new`分配 + `free`释放**: 不会调用析构函数,导致对象资源(如动态内存、文件句柄)泄漏[^4]。 - **`malloc`分配 + `delete`释放**: 可能触发未定义行为,因`delete`期望调用析构函数,但对象未正确构造[^4]。 --- #### 7. **底层实现关联** - `new`的底层可能调用`malloc`,但会封装异常处理构造函数调用[^4]。 - `delete`的底层可能调用`free`,但会先调用析构函数[^4]。 --- ### 总结对比表 | 特性 | `new/delete` | `malloc/free` | |---------------------|----------------------------------|-----------------------------| | 类型 | 操作符 | 函数 | | 初始化/清理 | 调用构造/析构函数 | 仅分配/释放内存 | | 类型安全 | 自动计算大小,返回类型正确指针 | 需手动计算大小,返回`void*` | | 错误处理 | 抛异常(默认) | 返回`NULL` | | 自定义类型支持 | 完整对象生命周期管理 | 仅内存操作 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值