这里需要说明的是,new运算符和malloc函数,并不只是有语法层面的不同——两者的功能是完全不一样的。malloc只是分配一块指定大小的堆内存,而new则不同——它同时包括两个步骤:

  • 调用malloc分配一片堆内存
  • 建立变量或者对象——如果要建立的是一个对象的话,那么这一步new运算符会调用类的构造函数来完成

除此之外,还有一点是 重载的new运算符——“就地构造” placement new。它的作用是在指定的内存地址上构造对象。语法形式如下所示:

new(address) Object();

举个例子,如果我们有一个类Class,那么当我们执行以下代码的时候:

Class *p=new Class();

我们相当于在执行:

Class *p=(Class*)malloc(sizeof(Class));
new(p) Class();

如果一些堆上的对象需要反复构造和销毁的话,那么你可以使用malloc函数配合 placement new ,这样可以节省分配内存的开销。

以上来自计蒜客:)