简单介绍(日后完善)
当我们使用关键字new
在堆上动态创建一个对象A时,比如 A* p = new A()
,它实际上做了三件事:
- 向堆上申请一块内存空间(做够容纳对象A大小的数据) 分配对象的空间
- 调用构造函数 (调用A的构造函数(如果A有的话))把对象的成员进行初始化
- 返回正确的指针
malloc 则必须要由我们计算字节数,并且在返回后强行转换为实际类型的指针。
- malloc 函数返回的是 void * 类型,需要进行实际类型的类型转化。否则报错
- 函数的实参为 sizeof(int) ,用于指明一个整数类型需要的个数。
int *p = (int*)malloc(sizeof(int) * 100);
//分配可以放得下100个整数的内存空间。
free(p)
int *p = new int[100];
delete[] p;//一定有[]的
- malloc/free只是动态分配内存空间/释放空间。而new/delete除了分配空间还会调用构造,析构函数进行初始化与清理(清理成员)。
- malloc/free需要手动计算类型大小且返回值为void*,new/delete可自己计算类型的大小对应类型的指针。
- new/delete的底层调用了malloc/free。
- malloc/free申请空间后得判空,new/delete则不需要。
- new直接跟类型,malloc跟字节数个数。