new和malloc都是可以用来动态内存分配,但楼主在多次实习面试中都被问到,以前学习时并没引起注意,所以上网/看书回顾了这部分知识。自己再整理了一下。
new和malloc的不同点
- malloc是c/c++的标准库函数,而new是c++的运算符。
- malloc和new申请内存空间时,分配成功两者都是返回指向堆里面的一块内存;两者的区别在于分配失败的时候。对于malloc来说,分配失败会返回一个空指针;对于new来说,分配失败返回值有两种,一种是申请时没有申明nothrow则返回空指针(如 A a =new A),另一种是申请时申明nothrow则抛出std::bad_alloc异常
- new返回指定类型的指针,并且可自动计算内存大小;malloc需要人工计算内存分配,并且返回需要强制转换。什么意思呢,我举个例子
//动态分配一个数组 int* p = new int[100]; int* q = (int*)malloc(sizeof(int)*100); /*同样是分配长度为100的整型数组,malloc需要先计算整型的大小再算上100得到最终申请的大小,而且malloc原型为void *malloc(unsigned int num_bytes)返回是void*指针,void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。*/
- malloc只能进行内存分配,而不对所得内存初始化;new既可以分配内存,也可以进行初始化(即调用该类型的构造函数)
int* p = (int*)malloc(sizeof(int));//malloc不会初始化
printf("%d\n", *p);
int* q = new int;//这样new也没有初始化
printf("%d\n", *q);
int* a = new int();//调用int的无参数构造函数
printf("%d\n", *a);
int* b = new int(10);
printf("%d\n", *b);//答案在下方
new和malloc使用注意
- 申请内存空间后,都必须检查是否分配成功(如 if(p!=NULL))
- 不再使用时,记得释放(malloc分配内存只能由free释放;new分配内存只能由delete释放),并且把该指针指向NULL
- 除了空指针可以释放多次,其余只能释放一次,释放多次会出现异常
- new/delete的功能完全覆盖malloc/free,但由于c++常调用c函数,c函数只能用malloc/free。所有malloc/free依旧保留,并没有废除
有什么不对的,还请大家指出!!