new delete和 malloc free的区别


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;


你可能感兴趣的:(new delete和 malloc free的区别)