malloc/free 与new/delete 区别总结
参考了一些博主的,作总结如下:
原文链接:https://blog.csdn.net/cherrydreamsover/article/details/81022039
1、 malloc/free 是c/c++ 标准库函数 new/delete 是c++操作符
2、 申请内存位置不同
new操作符 在自由存储区上为动态分配内存空间的, malloc从堆上动态分配内存。
自由存储区是C++基于new操作符
C++内存布局:内存区分为5个区,栈、堆、自由存储区、全局/静态存储区、常量区
3、返回值类型不同
new分配成功时,返回的是对象类型的指针,而malloc返回void*,需要通过强制转换才能转成我们需要的类型
4、定制内存大小不同
malloc/free手动计算大小,而new、delete编译器自动计算
5、 内存分配失败时,new抛出bad_alloc异常,不会返回NULL。而malloc分配内存失败返回null
6、
malloc/free只是动态分配、释放内存空间。而new/delete除了分配空间还会调用构造函数和析构函数进行初始化与清理成员。重要!!!!
c++ primer plus中的一个例子
#include <iostream>
#include <string>
using namespace std;
char* getname(void);
int main(void)
{
char* name;
name =getname();
cout<< "The length of "<<name <<" is"<<strlen(name)<<endl;
delete [] name;
name =getname();
cout<<"The length of" <<name<< " is"<<strlen(name)<<endl;
delete [] name;
system("pause");
}
char* getname()
{
char tmp[80];
cout<<"Enter last name:";
cin>>tmp;
char *pn=new char[strlen(tmp)+1];//用strlen计算分配所需大小的内存
strcpy(pn,tmp);//把输入的放到pn指针指向的内存中去
return pn;
}
对于用户自定义的对象而言,用maloc/free无法满足动态管理对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。
具体调用是,new分配内存时,先调用malloc后调用构造函数,释放空间时,先调用析构函数,后调用free。