本博客长期更新
1、int a = 0 and int a(0) 的区别
2、new/delete和malloc/free的区别
相同点:均可用于申请动态内存和释放内存
不同点:
(1)操作对象不同
malloc/free是c++标准库函数,而new/delete是c++的运算符。对于非内部数据类的对象而言,仅仅使用malloc和free不能满足动态对象的要求。此外,对象在创建同时要自动执行构造函数,消亡时候要执行析构函数;由于malloc和free是库函数而不是运算符,无法把执行构造和析构函数任务强加于malloc和free身上。
(2)用法上不同
——-函数malloc的原型
void *malloc(size_t size)
用malloc申请长length的整形内存,程序如下
int p=(int )malloc(sizeof(int)*length);
有两点需注意:1、强制类型转换 2、sizeof
(一)void*表示未确定类型的指针,需要进行类型转换,讲void*转换成需要的指针类型
(二)malloc并不关心要申请的内存是什么类型,只关心长度是多少
——-函数free的原型
void free(void *memblock)
指针的类型及所指内存的容量事先知道,p是NULL,free(p)不会出错,如果不是NULL,连续free 两次会编译出错
——-函数new的原型
int*p=new int[length]
int p2=(int )malloc(sizeof(int)*length)
new内部覆盖了sizeof、类型转换和类型检查等问题。
对于非内部对象而言,new语句如下:
obj * object=new obj[100];
不能写成obj *object=new obj[100] (1);
——-函数delete
delete释放对象数组,不可遗漏[]
delete []object;// right
delete object;//wrong 还有99个没有清空
总结:
- new自动分配空间,而malloc需要手动计算
- new是安全的,malloc性能不高
int *p=new float[2];//编译时指出错误
int p2=(int)malloc(sizeof(float)*len);//无法指出错误
其实new操作分两步走,分别是operator new,再就是constructor - operator new对应malloc,但operator new可以重载,可以自定义内存分配策略,甚至不分配内存,而malloc不行
- new将会调用constructor,malloc不能;delete将调用deconstructor,free不能
- malloc/free需要库函数支持,new不需要。
例子:
class Obj{
public:
Obj() {
cout << "Initialization1" << endl;
}
~Obj() {
cout << "Destroy1" << endl;
}
void Initialize() {
cout << "Initialization2" << endl;
}
void Destroy() {
cout << "Destroy2" << endl;
}
}obj;
void UseMallocFree(){
Obj * a = (Obj *)malloc(sizeof(obj)); // allocate memory
a->Initialize(); // initialization
// …
a->Destroy(); // deconstruction
free(a); // release memory
}
void UseNewDelete(void){
Obj * a2 = new Obj;
// …
delete a2;
}
int main() {
UseMallocFree();
return 0;
}
如果main函数执行另外一个:
int main() {
UseNewDelete();
return 0;
}