区分new , operator new, placement new
时间:2010-12-13 来源:yezizhe
CA表示一个类,那上面的代码就算是生成一个CA的对象,也就是执行new的操作。new是一个操作符,它的过程分为两步,首先从堆中分配一个对象,然后调用构造函数进行初始化,用代码写出来就是下面这样:
CA *pa = operator new(sizeof(CA)) //相当于malloc,实际可以这样子调用
pa.pa() //构造函数,实际没办法这样调用
我们看到operator new, 它是用来向系统申请内存空间的,即上面所说的new操作的第一步,相当于c语言的malloc操作。所以可以通过重载operator new实现自定义的内存分配方案,包括全局的operator new和类里面的operator new,这也是内存池实现的基础。简单说当使用new操作符,它首先调用operator new分配空间,再调用构造函数。
再看下一个例子:
void* buffer=operator new(100*sizeof(CA));///分配100个对象的空间
CA *pa = new(buf) CA;
上面是placement new的用法:用来在已经分配好的内存空间建立一个对象,可以免去分配内存的时间消耗,接着调用构造函数。比如上面例子,在buf地址创建一个CA的对象,而buf已经是分配好的内存空间,这也是跟new不同的地方,然后会自动调用其构造函数。注意的是删除对象时候,应该调用pa.~CA() ,不能进行delete pa操作。因为pa的内存空间实际上是buffer申请分配的,而pa对象是指使用了那块内存,因此只需要手动把pa析构即可,而真正的内存空间应该交给buffer进行处理,既delete buffer,把内存释放给系统。