请问牛人new和malloc分配相同内存问题
int*nArray=newint[100];和int*nArray=(int*)malloc(100*sizeof(int));请问这两句话执行后,内存中,new会比m...
int* nArray = new int[100];和
int* nArray = (int*)malloc(100 * sizeof(int));
请问这两句话执行后,内存中,new会比malloc多一些信息(也就是就多一些额外的指针的信息)?
请明白人指点。。。 展开
int* nArray = (int*)malloc(100 * sizeof(int));
请问这两句话执行后,内存中,new会比malloc多一些信息(也就是就多一些额外的指针的信息)?
请明白人指点。。。 展开
1个回答
展开全部
区别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是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是通过指定类型和元素长度然后编译器隐式计算内存大小,然后按指定类型返回对应的指针。
赛麦吉
2023-06-03 广告
2023-06-03 广告
这是一张ISO12233:2000标准的分辨率测试卡,目前已被ISO12233:2014 eSFR分辨率测试卡所取代,但是目前使用ISO12233:2000标准的分辨率测试卡还是比较多。 类型 反射式:由前面照明的反射式测试标板 透射式:可...
点击进入详情页
本回答由赛麦吉提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询