new的头文件可定义多达六种使用new的重载方式。其中两种方式-- placement new和placement 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;
在已分配的内存中构造一个对象
最新推荐文章于 2023-01-16 22:29:32 发布