Skip to content

c++中new和malloc的区别

malloc函数只负责分配一块堆内存,并不负责构造对象。malloc返回一个void *指针,使用时要将这个指针转换成对象的类型。

new关键字用于c++中的内存分配表达式,new表达式实际上完成了两件事——分配一块堆内存并在这块内存上构造对象。因此,如果一个类没有定义默认构造函数,是不能用new来分配该类的动态数组的。

用户可以自定义operator new和operator delete,代替new和delete表达式的内存分配和释放

定位new(Replacement new)

定位new是一种表达式,作用是在内存上分配对象,可以是堆内存,也可以是栈内存,将内存指针作为参数传递给placement new即可。

可以使用定位new在一块未初始化的堆内存上构造对象,例如

T *p = (T*)malloc(sizeof(T));
new (p) T(); //定位new

定位new不负责分配内存,只负责构造对象,因此不能使用delete去释放内存。如果想销毁对象,调用对象的析构函数。