new&malloc
new 与 malloc 的区别
- malloc始终返回标准类型最大的对齐内存
__STDCPP_DEFAULT_NEW_ALIGNMENT__; |
- new分配按照alignas大小分配;如果用malloc是未定义行为
struct alignas(64) A { |
- 在结构体中使用union,该属性不被初始化
new(&mResult) T(std::move(ret)); |
属性
- 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 函数进行再次分配内存
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LZY的Code生活!