- 属性
- new/delete是关键字 需要编译器支持;
- malloc/free是库函数,需要头文件支持。
C++中new/delete不依赖任何语句就存在;但malloc/free需要引用"iostream"。但C语言中就不存在new/delete。
- 参数
- new在使用时,无需指定内存块的大小
- 但malloc需要显式地指出所需内存的尺寸
- 返回类型
- new内存分配成功时,严格返回对象类型的指针,是符合类型安全的操作符
- malloc函数定义返回值为void*,即任何类型的指针,故需要强制类型转换
- 自定义类型
- new会先调用operator new函数,申请足够的内存(通常底层使用malloc实现)。然后调用类型的构造函数,初始化成员变量,最后返回自定义类型指针
例如在创建如下结点的链表时
typedef struct node{
string word;
struct node* next;
}Node,*List;
int main
{
string a ="123456";
...... // 为链表节点赋值
}
- 使用malloc分配空间会报错
Link p = (Link)malloc(sizeof(Node));
p->word = a;
- 而使用new则会正常运行
Link p =new Node;
p->word =a;
- malloc是库函数,只能动态的申请和释放内存,无法强制要求其做自定义类型对象构造和析构工作。
- 重载
- new允许重载
- malloc不可以
- 内存区域
- new从自由存储区为对象动态分配内存空间。
- malloc从堆上动态分配内存