这里需要说明的是,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 ,这样可以节省分配内存的开销。
以上来自计蒜客:)