<b>在预先定义的内存位置构造一个对象</b>[VC/C++编程]
本文“<b>在预先定义的内存位置构造一个对象</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
常常有人问这样一个C++问题:如安在预先定义的内存位置构造一个对象?在预先定义的内存缓冲构造一个对象有很多有效的利用.比方,一个定制的垃圾汇集器能利用一个大的预分配内存缓冲,用户在这个缓冲中构造其对象.当不再需求这些对象时,它们的存储空间被自动收回.
这个技术在器重时间的利用中也很有效.在预先分配的内存缓冲构造一个对象是一种“时间常量”操作,之所以这样说是因为程序分配操作本身不会浪费贵重的时间.同时也要注意当系统没有充足的内存时,动态内存分配大概失利.因此,关于器重任务的利用,预先分配一个充足大的缓冲有时是不可避免的.
很多利用需求在给定的时间构造差别范例的对象.想一想这样一个例子,一个GUI利用按照用户的输入,每次、显示差别的对话框,操纵反复分配和释放内存,这个利用能提早成立一个内存缓冲,并能在这个缓冲里反复构造和销毁差别范例的对象.
C++供应了几种特点来便利实目前预先决意的内存位置构造一个对象的任务.在这些特点中,包含一个特别情势的new操作符,叫做“定位new”(placement new)操作,以及一个显式的析构处理.实现办法以下:
第一步:分配一个充足的内存缓冲区,以便存放给定范例的对象.假如想要每次构造差别范例的对象,需求至少以最大的对象所占空间的大小分配一个缓冲.预分配的缓冲是在可用内存空间中分配的纯字符数组.
char * buff = new char [sizeof (Foo) ];
一旦分配了缓冲,就可以在缓冲中构造每一种范例的对象.为此,利用特别版本的new操作符(“定位new”),以缓冲地址为placement new的参数.为了利用placement new,必须包含尺度头文件<new>.下面的代码片断中,利用placement new操作在内存地址buff上构造范例为Foo的对象.
#include <new>
Foo * pfoo = new (buff) Foo; //利用new操作在buff上构造一个 Foo
Placement new 以先前分配的缓冲(buff)地址作为参数,并在这个缓冲上构造给定范例的对象.他返回构造对象的指针,这个对象指针的利用与普通的指针利用没什么两样.
unsigned int length = pfoo->size();
pfoo->resize(100, 200);
length = pfoo->size();
当不再需求这个对象的时刻,必须显式调用其析构函数释放空间.做这件事是有一些本领的,因为很多人错误地假定对象会被自动销毁,错也!.在预分配的缓冲里构造另一个对象之前大概在释放缓冲之前,假如忘了显式调用析构函数,程序将产生不可意料的后果.显式的析构器声明以下:
pfoo->~Foo(); //显式调用析构函数
换句话说,一个显式的析构器与普通的成员函数调用一样,只是名字与普通的成员函数稍有差别.一旦对象被销毁,便可以在预分配的内存中再次构造另一个对象.实际上,这个历程可以无限制地反复:构造一个对象,销毁它,然后又反复操纵预分配的缓冲构造新对象.
当不再需求预定义的缓冲时,大概说当利用程序关闭时,必须释放预定义的缓冲.利用delete[]完成这个任务,因为预定义的缓冲是一个字符数组.下列代码包含一个完好的例子的全部步骤,包含终究缓冲的释放:
#include <new>
void placement_demo()
{
//1. 预分配缓冲
char * buff = new char [sizeof (Foo) ];
//2. 利用 placement new
Foo * pfoo = new (buff) Foo;
//利用对象
unsigned int length = pfoo->size();
pfoo->resize(100, 200);
//3. 显式调用析构函数
pfoo->~Foo();
//4. 释放预定义的缓冲
delete [] buff;
}
以上是“<b>在预先定义的内存位置构造一个对象</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |