遵循placement new的用法规范(zz)

转载 2008年09月28日 18:02:00

     标准的开始<new>由一个特别的操作符new来定义,这个就是我们熟知的placement new。和其他普通的new不同的是,它在括号里多了另外一个参数。比如:

Widget * p = new Widget; //ordinary new  //普通的new pi = new (ptr) int;

pi = new (ptr) int; //placement new

括号里的参数是一个指针,它指向一个内存缓冲器,placement new将在这个缓冲器上分配一个对象。Placement new的返回值是这个被构造对象的地址(比如扣号中的传递参数)。placement new主要适用于:在对时间要求非常高的应用程序中,因为这些程序分配的时间是确定的;长时间运行而不被打断的程序;以及执行一个垃圾收集器(garbage collector)。

使用方法

在很多情况下,placement new的使用方法和其他普通的new有所不同。这里提供了它的使用步骤。

第一步  缓存提前分配

为了保证通过placement new使用的缓存区的memory alignmen(内存队列)正确准备,使用普通的new来分配它:

class Task ;

char * buff = new [sizeof(Task)]; //分配内存

(请注意auto或者static内存并非都正确地为每一个对象类型排列,所以,你将不能以placement new使用它们。)

第二步:对象的分配

在刚才已分配的缓存区调用placement new来构造一个对象。

Task *ptask = new(buff) Task

第三步:使用

按照普通方式使用分配的对象:

ptask->suspend();

ptask->resume();

//...

第四步:对象的毁灭

一旦你使用完这个对象,你必须调用它的析构函数来毁灭它。按照下面的方式调用析构函数:

ptask->~Task(); //调用外在的析构函数

第五步:释放

你可以反复利用缓存并给它分配一个新的对象(重复步骤2,3,4)如果你不打算再次使用这个缓存,你可以象这样释放它:

delete [] buff;

跳过任何步骤就可能导致运行时间的崩溃,内存泄露,以及其它的意想不到的情况。如果你确实需要使用placement new,请认真遵循以上的步骤。


本文作者:Danny Kalev是具有14年经验的系统分析员和软件工程师,他主要专长于C++和面象对象程序设计。

遵循placement new的用法规范

 标准的开始由一个特别的操作符new来定义,这个就是我们熟知的placement new。和其他普通的new不同的是,它在括号里多了另外一个参数。比如: ...
  • cyblueboy83
  • cyblueboy83
  • 2008年01月17日 12:23
  • 1042

(转)遵循placement new的用法规范

标准的开始由一个特别的操作符new来定义,这个就是我们熟知的placement new。和其他普通的new不同的是,它在括号里多了另外一个参数。比如: Widget * p = new Widget...
  • business122
  • business122
  • 2016年09月19日 15:33
  • 157

遵循placement new的用法规范

标准的由一个特别的操作符new来定义,这个就是我们熟知的placement new。和其他普通的new不同的是,它在括号里多了另外一个参数。比如:Widget * p = new Widget; //...
  • kevinwhite
  • kevinwhite
  • 2008年06月06日 12:53
  • 203

c++ placement new操作符的使用技巧

在c++中new和delete操作是我们操作内存最常用的一对操作符,在使用new时编译器会申请内存,然后调用类的构造函数来初始化对象,调用delete会销毁对象同时释放该对象占用的内存,并且我们可以重...
  • D_Guco
  • D_Guco
  • 2017年01月04日 23:18
  • 1338

关于C++的placement new和placement delete

昨天发贴提了个问题,今天总结在这。原帖点击进入,有兴趣可以看看,我呆会儿还会说。 C++的new是语言自定义的操作符,这个操作符的行为包含两件事,而且你不能改变。 第一件事:调用operato...
  • High_High
  • High_High
  • 2012年03月27日 01:03
  • 6729

全面解析C++中的new,operator new与placement new

全面解析C++中的new,operator new与placement new   以下是C++中的new,operator new与placement new进行了详细的说明介绍,需要的朋友...
  • walkerkalr
  • walkerkalr
  • 2014年03月27日 12:54
  • 666

C++ placement new 用法举例zz

http://www.blogjava.net/dongwq/archive/2010/04/20/318874.html   C++ placement new 用法举例zz 2009-12-...
  • fjiale
  • fjiale
  • 2012年07月22日 00:06
  • 427

C++ placement new与内存池

C++ placement new结合内存池完美避开各种内存问题~
  • Kiritow
  • Kiritow
  • 2016年05月04日 14:42
  • 510

placement new的用法

转自 http://www.builder.com.cn/2004/0205/106181.shtml 标准的开始由一个特别的操作符new来定义,这个就是我们熟知的placement new。和其他普...
  • moreorless
  • moreorless
  • 2008年11月02日 10:36
  • 466

C++中的定位放置new(placement new)

一般来说,使用new申请空间时,是从系统的“堆”(heap)中分配空间。申请所得的空间的位置时根据当时的内存的实际使用情况决定的。但是,在某些特殊情况下,可能需要在程序员指定的特定内存创建对象,这就是...
  • K346K346
  • K346K346
  • 2015年10月30日 17:03
  • 2412
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:遵循placement new的用法规范(zz)
举报原因:
原因补充:

(最多只允许输入30个字)