在已分配的内存中构造一个对象

ZDNet软件频道 时间:2003-07-17 作者:ZDNet China |  我要评论()
本文关键词:cpptips
new的头文件可定义多达六种使用new的重载方式。其中两种方式-- placement new和placement new[] 可以使你在已分配的存储缓冲器中定义一个对象或者一组数组对象。
本文译自Builder.com,未经许可请勿转载new的头文件可定义多达六种使用new的重载方式。其中两种方式-- placement newplacement new[] 可以使你在已分配的存储缓冲器中定义一个对象或者一组数组对象。

placement new代替普通的new定义对象,在一些有时间限制的应用程序中起到了不小的作用,在那些程序中对象的定义要在一定的时间内完成。普通new定义的对象的生存时间是未定的,因而可能会造成操作失效。

为了避免操作失效,我们可以分配一个足够大且未使用的存储缓冲器,然后将程序中所有的对象分配到缓冲器中。为了使讨论简单化,我们集中讨论placement new

首先,用普通的new分配存储缓冲器,但不要使用动态或者静态存储装置,因为它可能无法满足对构造对象进行校正的需求。

void *buff=new char[sizeof(Myclass)];

接着,用placement new在已经分配好的的缓冲器上创建一个对象。

    #include <new> //needed for placement new

Myclass *p = new(buff) Myclass;

需要指出的是,p指向的是一个Myclass类型的对象。该对象已经分配到缓冲器中。

与分配给自由存储的普通对象不同的是,放置对象的析构函数必须明确的被调用。

 p->~Myclass();  //explicit destructor invocation

失败地调用析构函数会引起未知的问题的发生。通常,只有在明确的调用析构函数以后,才能释放缓冲器中的内容。

      delete[] buff;



责任编辑:炒饭

欢迎评论或投稿


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