详解请点击下面的链接,
https://www.cnblogs.com/ywliao/articles/8116622.html
1.关键字不一样new(申请空间) | delete(释放空间) | 不用头文件 |
malloc(申请空间) | free(释放) | cstdlib |
自由存储区是C++基于new *** 作符的一个抽象概念,凡是通过new *** 作符进行内存申请,该内存即为自由存储区。
new | 从自由存储区 动态分配内存 |
malloc | 从堆区创建 |
new | malloc |
返回的类型与变量类型一致 | 返回类型默认 void *,可以自己设置返回类型 |
不需要设置内存大小(自动计算) | 需要给出内存的大小 |
new:
int *p = new int(10);
//数组
int *p1= new int[10];//开辟10个空间
malloc:
int * p = (int *)malloc(sizeof(int));//开辟1个
*p = 10;
int* p2 = (int *)malloc(sizeof(int) * 10);//开辟10个
for (int i = 0; i < 10; i++)
{
p2[i] = i;
}
释放内存时
new:
delete p;
//如果为数组时
delete[]p1;
malloc:
free(p);
4.分配内存失败时
new :会抛出异常(异常处理)bed_alloc 不会返回 NULL
malloc:会返回 NULL
5.是否调用构造和析构函数new分配内存对象:
- 分配空间
- 调用构造函数构造对象
- 返回该对象指针
delete:
- 调用析构
- 用delete释放内存
malloc不会调用构造和析构
6.是否可以重载new 和 delete 可以重载
malloc 和free 不可以重载
7.内存扩充new /delete | malloc/free |
不可以直接扩充 | 可以用remalloc来直接扩充 |
总结:
特征 | new/delete | malloc/free |
分配内存的位置 | 自由存储区 | 堆 |
内存分配失败返回值 | 完整类型指针 | void* |
内存分配失败返回值 | 默认抛出异常 | 返回NULL |
分配内存的大小 | 由编译器根据类型计算得出 | 必须显式指定字节数 |
处理数组 | 有处理数组的new版本new[] | 需要用户计算数组的大小后进行内存分配 |
已分配内存的扩充 | 无法直观地处理 | 使用realloc简单完成 |
是否相互调用 | 可以,看具体的operator new/delete实现 | 不可调用new |
分配内存时内存不足 | 客户能够指定处理函数或重新制定分配器 | 无法通过用户代码进行处理 |
函数重载 | 允许 | 不允许 |
构造函数与析构函数 | 调用 | 不调用 |
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)