malloc 和 free 是 C 语言中的函数,也可以用在 C++ 中,但在 C++ 中却视为不安全的内存操作。而 new 和 delete 是 C++ 中的两个运算符,完全可以替代 malloc/free 完成内存的操作,且为安全的内存操作。在C++ 中保留 malloc/free 是为了和 C 语言保持兼容,因此在 C++ 中尽量使用 new/delete。它们的区别有以下几点:
malloc / free 为 C/C++ 标准库函数,而 new/delete 为 C++中的运算符。
new 创建的对象有类型,而 malloc 返回 void* 类型,需要强制转换为指定的类型。
new 时会根据制定类型自动计算大小且会调用对象的构造函数完成初始化,而 malloc 只分配指定大小的内存,不进行初始化,其值是随机的。delete 时自动调用对象析构函数,而 free 不会。
new 失败时,会调用 new_handler 处理函数,而 malloc 失败紧返回 NULL,不做善后处理,因此往往需要检查分配是否成功。
int *a = new int[5];
int *b = (int *)malloc(5*sizeof(int));
new 的三种形态:new operator,operator new,placement new。
new operator(new运算符)的执行过程:
- 通过 operator new 分配内存,默认调用 malloc 分配内存,可重载 operator new 函数;
void *operator new(size_t size);
使用 placement new 调用对象构造函数(内部简单类型(如 int)忽略此步);
返回内存指针。