new 与 malloc 的区别

  • malloc始终返回标准类型最大的对齐内存
__STDCPP_DEFAULT_NEW_ALIGNMENT__;
  • new分配按照alignas大小分配;如果用malloc是未定义行为
struct alignas(64) A {
long double ld;
double d;
};

A *q = (A*)new (std::align_val_t(alignof(A)))char[sizeof(A)]
  • 在结构体中使用union,该属性不被初始化
new(&mResult) T(std::move(ret));
// 等价于
std::construct_at(&mResult, std::move(ret));

mResult.~T();
// 等价于
std::destroy_at(&mResult);

属性

  • new/delete 是 C++关键字,需要编译器的支持
  • malloc/free 是库函数,需要引用对应的库

使用区别

  • 无需显示填入申请内存的大小,会根据申请的类型进行动态分配内存
  • malloc 分配内存需要显示填入申请内存的大小

内存位置差别

  • malloc 在堆上分配
  • new 在自由存储区中分配,一般实现是堆,也可以重载成在静态存储区中分配

返回类型区别

  • new 返回成功时返回对象类型的指针,类型严格与对象匹配
  • malloc 返回 void*,需要自己强制转换

分配失败区别

  • new 抛出 std::bad_alloc 异常
  • malloc 分配内存失败返回 NULL (一般为(void*)0)

分配过程区别

new 操作符

  • 调用 operator new 分配一块足够用的内存(底层默认 malloc 实现)
  • 编译器运行相应的构造函数构造对象并传入初始值
  • 返回指针

扩张内存的区别

  • malloc 内存后,发现不够用,可以调用 realloc 函数进行再次分配内存