1.operator new
一般在申请内存空间时使用::operator new(size_t )来申请内存空间,比如:
T* tmp=(T*)(::opreator new ((size_t)(size*sizeof(T))));
operator new的作用:
1)只要求分配空间,不调用相关类型的构造函数;
2)可以被重载,可以实现不同的内存分配行为,重载时返回类型必须申明为void*,在重载时第一个参数必须为要求分配空间的大小(字节)类型为size_t。
2.new
在C++中new operator与operator new非一回事也,new operator(即所谓的new expr
new operator与delete operator的行为是不能够也不应该被改变即被重载,这是C++标准作出的承诺。而operator new
与operator delete和C语言中的malloc与free对应,只负责分配及释放空间。但使用operator new分配的空间必须使用
operator delete来释放,而不能使用free,因为它们对内存使用的登记方式不同。反过来亦是一样。
你可以重载operator new和operator delete以实现对内存管理的不同要求,但你不能重载new operator或delete
operator以改变它们的行为。
3.placement new
如果你想要在一个已经分配好的内存空间上初始化一个对象使用new是行不通的,可以使用placement new
,placement new 只是operator new重载的一个版本,它并不分配内存,只是返回指向已经分配好的某段内存的一个
指针。比如 new(p)T1(value),则在指针P所指向的空间创建一个类型为T1的对象,调用的构造函数。
使用new操作符分配内存需要在堆中查找足够大的剩余空间,显然这个操作速度是很慢的,而且有可能出现无法分配
内存的异常(空间不够)。
placement new 就可以解决这个问题。我们构造对象都是在一个预先准备好了的内存缓冲区中进行,不需要查找内
存,内存分配的时间是常数;而且不会出现在程序运行中途出现内 存不足的异常。所以,placement new非常适合那
些对时间要求比较高,长时间运行不希望被打断的应用程序。