operator new,new operator和placement new的使用

来源:互联网 发布:淘宝上新怎么抢的快 编辑:程序博客网 时间:2024/05/17 02:05


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 expression)乃语言内建,咱们是没法改变其行为的,当你写string *ps = new string("Hello World!")时,你所使用的new是所谓的new operator,它其实干了两件事:一、分配足够的内存(实际大小是大于所创建的对象大小)二、调用对象构造函数,new operator永远干这两件事。

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非常适合那

些对时间要求比较高,长时间运行不希望被打断的应用程序。



原创粉丝点击