1、申请内存的位置
new从自由存储区为对象分配内存,malloc从堆上分配。
自由存储区是C++基于new *** 作符的一个抽象概念,凡是通过new *** 作符进行内存申请,该内存即为自由存储区。而堆是 *** 作系统中的术语,是 *** 作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放已分配的对应内存。
自由存储区是否能够是堆(问题等价于new是否能在堆上动态分配内存),这取决于operator new 的实现细节。自由存储区不仅可以是堆,还可以是静态存储区,这都看operator new在哪里为对象分配内存。
2、返回类型安全性
new *** 作符分配成功,返回对象类型指针,不用类型转换;
malloc分配成功,返回voID*,需要强制类型转换成对象类型指针;
3、分配失败
new失败,抛出异常,不返回NulL;
malloc失败,返回NulL;
4、指定内存大小
new不需要;
mallco需要显示指定(sizeof(type)*n);
5、调用构造函数、析构函数
new:调用operator new分配足够大的内存,运行构造函数,返回对象指针
delete:调用对象的析构函数,调用operator delete释放空间
而malloc不会
总结:
特征 | new/delete | malloc/free |
---|---|---|
分配内存的位置 | 自由存储区 | 堆 |
内存分配成功返回值 | 完整类型指针 | voID* |
内存分配失败返回值 | 默认抛出异常 | 返回NulL |
分配内存的大小 | 由编译器根据类型计算得出 | 必须显式指定字节数 |
处理数组 | 有处理数组的new版本new[] | 需要用户计算数组的大小后进行内存分配 |
已分配内存的扩充 | 无法直观地处理 | 使用realloc简单完成 |
是否相互调用 | 可以,看具体的operator new/delete实现 | 不可调用new |
分配内存时内存不足 | 客户能够指定处理函数或重新制定分配器 | 无法通过用户代码进行处理 |
函数重载 | 允许 | 不允许 |
构造函数与析构函数 | 调用 | 不调用 |
以上是内存溢出为你收集整理的new 和 malloc 区别全部内容,希望文章能够帮你解决new 和 malloc 区别所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)