如何定位放置new

ZDNet软件频道 时间:2003-12-08 作者:ZDNet China |  我要评论(1)
本文关键词:new vc cpptips
标准首部由一个特别的操作符new来定义,这个就是我们熟知的placement new。本文我们将告诉你如何定位放置new.
本文译自Builder.com,未经许可请勿转载 标准首部<new>由一个特别的操作符new来定义,这个就是我们熟知的placement new。和其他普通的new不同的是,它在括号里多了另外一个参数。比如:

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

括号里的参数是一个指针,它指向一个内存缓冲器,placement new将在这个缓冲器上分配一个对象。Placement new的返回值是这个被构造对象的地址。在对时间要求非常高的应用程序中,placement new是非常有用的,因为这些程序分配的时间是确定的,它们必须长时间的运行并要进行垃圾回收。

使用方法

在一些时候placement new的使用方法和其他普通的new不同。这里提供了它的使用方法。

第一步  缓存提前分配

确定被placement new使用的缓存区的内存队列已经准备好,使用普通的new来分配它:

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

第二步:对象的分配

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

Task *ptask = new(buff) Task

第三步:使用

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

ptask->suspend();
ptask->resume();

//...

第四步:对象的毁灭

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

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

第五步:释放

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

delete [] buff;

如果跳过任何步骤就可能导致运行时间的崩溃,内存不够,以及其他的意想不到的状况。如果你需要使用placement new,请按照上面步骤一步步的执行。


本文作者Danny Kalev 是一个系统分析家、软件工程师,在C++和面向对象设计方面有着14年的专业经验。




责任编辑:李宁

欢迎评论投稿

百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134