在预先定义的内存位置构造一个对象

在预先定义的内存位置构造一个对象,第1张

在预先定义的内存位置构造一个对象,第2张

人们经常会问这样一个C++问题:如何在预定义的内存位置构造一个对象?在预定义的内存缓冲区中构造一个对象有很多有用的应用。例如,自定义垃圾收集器可以使用一个大的预先分配的内存缓冲区,用户可以在其中构造自己的对象。当不再需要这些对象时,它们的存储空会自动收回。

这项技术在对时间敏感的应用中也很有用。在预先分配的内存缓冲区中构造一个对象是一个“时间常数”操作,这么说是因为程序分配操作本身不会浪费宝贵的时间。另请注意,当系统没有足够的内存时,动态内存分配可能会失败。因此,对于重视任务的应用,提前分配足够大的缓冲区有时是不可避免的。

许多应用程序需要在给定时间构造不同类型的对象。想起这样一个例子。GUI应用程序根据用户的输入每次显示不同的对话框,并重复分配和释放内存。这个应用程序可以预先创建一个内存缓冲区,并可以在这个缓冲区中重复构造和销毁不同类型的对象。

C++提供了几个特性来简化在预先确定的内存位置构造对象的任务。这些特性包括一个特殊的新操作符“Placement New”和一个显式析构函数。实现方法如下:

步骤1:分配足够的内存缓冲区来保存给定类型的对象。如果你想每次构造不同类型的对象,你需要分配至少一个对象占用的空大小的缓冲区。预先分配的缓冲区是在可用内存空中分配的纯字符数组。

ar * buff = new char[sizeof(Foo)];

通过分配缓冲区,可以在缓冲区中构造每种类型的对象。因此,new运算符的一个特殊版本(“定位new”)用于缓冲带有放置new地址的参数。为了使用新的放置,必须包括标准头文件。在下面的代码片段中,placement new操作用于在内存地址buff中构造一个Foo类型的对象。

nclude

o * pfoo = new(buff)Foo;//使用new操作在buff上构造Foo

Placement new将之前分配的缓冲区(buff)地址作为参数,并在该缓冲区上构造给定类型的对象。他返回构造的对象的指针,这个对象的指针就像平常的指针一样使用。

有符号int length = pfoo-> size();
oo->resize(100,200);
ngth = pfoo-> size();

当不再需要这个对象时,必须显式调用它的析构函数来释放空。这样做是有一些技巧的,因为很多人误以为物体会自动销毁,错了!。如果在预先分配的缓冲区中构造另一个对象之前,或者在释放缓冲区之前,忘记显式调用析构函数,程序将会产生不可预知的后果。显式析构函数声明如下:

pfoo--> ~ Foo();//显式调用析构函数

换句话说,显式析构函数与普通成员函数调用相同,但其名称与普通成员函数略有不同。一旦一个对象被破坏,另一个对象可以在预先分配的内存中再次被构造。事实上,这个过程可以无限重复:构建一个对象,销毁它,然后重复使用预先分配的缓冲区来构建一个新的对象。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 在预先定义的内存位置构造一个对象

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情