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;


目录
相关文章
|
6天前
|
编译器 C语言 C++
【C语言】malloc()函数详解(动态内存开辟函数)
【C语言】malloc()函数详解(动态内存开辟函数)
75 2
|
6天前
|
程序员 编译器 C语言
C语言----动态内存分配(malloc calloc relloc free)超全知识点
C语言----动态内存分配(malloc calloc relloc free)超全知识点
14 6
|
6天前
|
程序员 编译器 C语言
C语言知识:动态内存管理(malloc free calloc realloc)
C语言知识:动态内存管理(malloc free calloc realloc)
|
6天前
|
Java 程序员 编译器
C语言中灵活多变的动态内存,malloc函数 && free函数&& calloc函数 && realloc函数
C语言中灵活多变的动态内存,malloc函数 && free函数&& calloc函数 && realloc函数
|
6天前
|
程序员 编译器 C语言
【C语言】动态内存管理之4个内存函数`malloc`,`free`,`calloc`和`realloc`深度了解
【C语言】动态内存管理之4个内存函数`malloc`,`free`,`calloc`和`realloc`深度了解
|
6天前
|
编译器 C语言 C++
【C语言】free()函数详解(动态内存释放函数)
【C语言】free()函数详解(动态内存释放函数)
35 0
|
6天前
|
C语言
C语言:内存函数(memcpy memmove memset memcmp使用)
C语言:内存函数(memcpy memmove memset memcmp使用)
|
5天前
|
C语言
C语言—内存函数的实现和模拟实现(内存函数的丝绸之路)
C语言—内存函数的实现和模拟实现(内存函数的丝绸之路)
18 0
|
5天前
|
C语言
C语言—字符函数与字符串函数(字符问题变简单的关键之技)
C语言—字符函数与字符串函数(字符问题变简单的关键之技)
6 0
|
1天前
|
C语言 C++
C语言进阶⑭(内存函数_以字节操作)momcpy+mommove+memcmp+memset
C语言进阶⑭(内存函数_以字节操作)momcpy+mommove+memcmp+memset
5 0