现在的位置: 首页 > 综合 > 正文

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

2013年11月20日 ⁄ 综合 ⁄ 共 666字 ⁄ 字号 评论关闭

new的头文件可定义多达六种使用new的重载方式。其中两种方式-- placement new和placement new[] 可以使你在已分配的存储缓冲器中定义一个对象或者一组数组对象。

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

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

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

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

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

    #include <new> file://needed for placement new

Myclass *p = new(buff) Myclass;

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

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

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

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

      delete[] buff;

 

【上篇】
【下篇】

抱歉!评论已关闭.