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;