new delete和 malloc free的区别

简介: 1. 在C++中申请动态内存与释放动态内存用new delete和malloc free都可以,并且new与malloc申请的内存空间位于堆区,无法被操作系统自动回收,需要手动delete 或 free来释放 2. new delete是C++中的一种运算符,malloc和free是C、C++中一种标准库函数,在C语言中需要用头文件#include支持。


1. 在C++中申请动态内存与释放动态内存用new delete和malloc free都可以,并且new与malloc申请的内存空间位于堆区,无法被操作系统自动回收,需要手动delete 或 free来释放

2. new delete是C++中的一种运算符,malloc和free是C、C++中一种标准库函数,在C语言中需要用头文件#include<stdlib.h>支持。对于类的对象而言,malloc和free是无法满足动态对象的要求的,因为对象在创建的时候要调用构造函数,在对象消亡的时候要调用析构函数,而malloc和free是无法执行构造函数和析构函数的


new delete和malloc free的区别有以下几点

1. new能够自动计算需要分配的内存空间,而malloc需要手动计算字节数。例如 int *p = new int[2], int *p = malloc(2*sizeof(int))

2. new delete返回具体对象类型指针,而molloc free是返回void类型的指针

3. new的类型是安全的,malloc不是

4. new用在动态对象分配的时候会调用构造函数,delete会调用析构函数。而malloc和free是不能的

5. new delete不需要库文件支持,而malloc和free是需要库文件#include<stdlib.h>支持


例子:解释为什么new delete在动态对象分配和销毁的时候会去执行构造函数和析构函数:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

class A{
public:
	A(){
	    cout<<"A is here"<<endl;
	}
	~A(){
	    cout<<"A is dead"<<endl;
	}
private:
	int i;
};


int main(){
	//使用new和delete
	A *p = new A();
	delete p;
	//使用malloc和free
	p = (A*)malloc(sizeof(A));
	free(p);

	return 0;
}

输出结果

A is here

A is dead

上面的结果很好的解释了new和delete会调用对象的构造函数和析构函数,而malloc和free是不能的。


3. new和delete,malloc和free必须要成对的使用,否则容易出现内存泄露问题。

    delete和free调用后,内存不会立即收回,指针也不会指向空,只是告诉操作系统这块内存要被释放了,可以用做其它的用途,为了防止野指针的出现,在delete和free之后要马上把指针的值赋为NULL

//new 分配
char *p = new char[3];
p = "ab";
delete []p;
p = NULL;
//malloc 分配
p = (char *)malloc(3*sizeof(char));
p = "dd";
free(p);
p = NULL;


目录
相关文章
|
3月前
|
程序员 C语言 开发者
pymalloc 和系统的 malloc 有什么区别
pymalloc 和系统的 malloc 有什么区别
|
3月前
|
程序员 C语言 开发者
pymalloc 和系统的 malloc 有什么区别?
pymalloc 和系统的 malloc 有什么区别?
|
4月前
|
存储 C语言
C语言:普通局部变量、普通全局变量、静态局部变量、静态全局变量的区别
C语言中,普通局部变量在函数内部定义,作用域仅限于该函数;普通全局变量在所有函数外部定义,作用域为整个文件;静态局部变量在函数内部定义但生命周期为整个程序运行期;静态全局变量在所有函数外部定义,但仅在定义它的文件内可见。
217 10
|
4月前
|
存储 C语言
C语言:结构体与共用体的区别
C语言中,结构体(struct)和共用体(union)都用于组合不同类型的数据,但使用方式不同。结构体为每个成员分配独立的内存空间,而共用体的所有成员共享同一段内存,节省空间但需谨慎使用。
|
4月前
|
存储 C语言
C语言指针与指针变量的区别指针
指针是C语言中的重要概念,用于存储内存地址。指针变量是一种特殊的变量,用于存放其他变量的内存地址,通过指针可以间接访问和修改该变量的值。指针与指针变量的主要区别在于:指针是一个泛指的概念,而指针变量是具体的实现形式。
|
23天前
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
55 23
|
23天前
|
算法 C语言
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
本文档介绍了如何编写两个子函数,分别求任意两个整数的最大公约数和最小公倍数。内容涵盖循环控制与跳转语句的使用、最大公约数的求法(包括辗转相除法和更相减损术),以及基于最大公约数求最小公倍数的方法。通过示例代码和测试说明,帮助读者理解和实现相关算法。最终提供了完整的通关代码及测试结果,确保编程任务的成功完成。
52 15
|
23天前
|
C语言
【C语言程序设计——函数】亲密数判定(头歌实践教学平台习题)【合集】
本文介绍了通过编程实现打印3000以内的全部亲密数的任务。主要内容包括: 1. **任务描述**:实现函数打印3000以内的全部亲密数。 2. **相关知识**: - 循环控制和跳转语句(for、while循环,break、continue语句)的使用。 - 亲密数的概念及历史背景。 - 判断亲密数的方法:计算数A的因子和存于B,再计算B的因子和存于sum,最后比较sum与A是否相等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台对代码进行测试,预期输出如220和284是一组亲密数。 5. **通关代码**:提供了完整的C语言代码实现
56 24
|
19天前
|
存储 C语言
【C语言程序设计——函数】递归求斐波那契数列的前n项(头歌实践教学平台习题)【合集】
本关任务是编写递归函数求斐波那契数列的前n项。主要内容包括: 1. **递归的概念**:递归是一种函数直接或间接调用自身的编程技巧,通过“俄罗斯套娃”的方式解决问题。 2. **边界条件的确定**:边界条件是递归停止的条件,确保递归不会无限进行。例如,计算阶乘时,当n为0或1时返回1。 3. **循环控制与跳转语句**:介绍`for`、`while`循环及`break`、`continue`语句的使用方法。 编程要求是在右侧编辑器Begin--End之间补充代码,测试输入分别为3和5,预期输出为斐波那契数列的前几项。通关代码已给出,需确保正确实现递归逻辑并处理好边界条件,以避免栈溢出或结果
52 16

热门文章

最新文章