区别1:
malloc是C的函数,New是C++的关键词。
区别2:
malloc的参数是字节长度,按照参数分配内存,内存空间大小由参数指定,单位字节; New主要用来创建类、结构对象,当然它包含分配内存的工作,不同的是,分配内存时是按照类或结构的定义来确定要分配多少字节。同时当New一个对象时,还负责调用类的构造函数以便初始化对象成员。同时它也用来动态分配数组,同样的,数组所占字节是通过数组长度和元素类型来确定,用户不能也无需指定确切的内存大小,编译器会在编译时确定(长度*元素类型宽度=所需分配内存大小),用户只需指定需要分配多少个元素及元素类型。 据说实质上,当New确定好字节长度后,最终会调用malloc分配内存。(我没研究过,因为我觉得没意义)
区别3:
malloc可以说是通用内存分配函数,它无需知道所分配的内存用于保存什么类型的数据,它只知道需要分配多少字节内存,因此返回的指针是无类型的,也即虚指针。所以,如果你知道该内存空间所保存的数据类型,还需将虚指针强制转换为指定类型的指针。 New所创建的对象、结构、数组,都是可以确定数据类型的,因此返回的是指定的类型指针,无需强制转换,当然,C++具有很强的灵活性,你完全可以先New一个int类型的数组,然后强制转换成4倍空间char类型的数组,这完全没问题,只要数据对齐,保证不越界即可。 因此总体上简单地说malloc灵活,直白简单,但内存和指针维护麻烦,需要转换,需要注意数据对齐,New功能强,使用方便。 那么,针对你的例子,做下说明 (int*)malloc(100*sizeof(int)) 是先取得int类型的字节宽度,然后乘100计算后得到400,然后调用malloc,并将400传递给函数,分配400字节的内存空间,但是返回的是虚指针,即纯地址,该地址的类型是未知的,也即缺少数据宽度的信息。因此最后根据实际要求强制转换为int *。 new int[100]是分配可保存100个整数的内存空间,因为已给定数据类型,因此总共需要分配100*4=400字节的空间,返回int *类型的指针。 综上所述,你的例子中2者实际效果没区别,但是代码和编译过程不同,malloc,需要显式定义内存空间大小和返回指针,new是通过指定类型和元素长度然后编译器隐式计算内存大小,然后按指定类型返回对应的指针。
//注意
malloc的返回值是void类型的指针,既然是指针所以在强制类型转换时还是需要变成某种类型的指针。
所以具体用的时候需要强制类型转换。(elemptype*)malloc(sizeof(elemptype));
elemptype指的是这个指针指代的内存空间所保存的数据类型。