allocator类就像C中的malloca函数,却不像是C中的new关键字,因为new关键字和allocator做的事情不同:
1.allocator只是分配内存
2.new关键字先分配对象,再构造一个对象。
所以说,allocator使得内存分配和创建对象分隔开来了。
用allocator类一般需要经过以下几步:
1.调用allocator开辟一块内存。
2.调用construct函数在该内存构造对象。
3.使用内存 中的对象。
4.调用destroy函数将内存中的对象释放。
5.调用deallocate函数将内存返还给系统。
例子:
allocator<string> alloc; //创建一个allocator对象
auto p = alloc.allocate(3); //分配10个string类型的内存空间
auto q = p;
alloc.construct(q,"hello");
alloc.construct(++q,"world");
alloc.construct(++q,"huang");
for_each(p,p+3,[](const string& word){cout<<word<<endl;});
cout<<*(p+2)<<endl; //打印huang
while( q != p )
alloc.destroy(q--);
cout<<*(p+2)<<endl; //这行代码添加进去将不会打印huang,因为对象已经被释放,指向的内存已经不存在这个对象了。
alloc.deallocate(p,3);
//cout<<*(p+2)<<endl; //如果将本行代码添加进去将会产生错误。
另外,STL算法库还提供其他几个函数:
uninitialized_copy,uninitialized_copy_n,uninitialized_fill,uninitialized_fill_n
这几个函数的作用就是给为初始化的内存进行赋值。
uninitialized_copy:
例子:
vector<string> TempVe(3,"hello");
allocator<string> NewAlloc;
auto Newp = NewAlloc.allocate(4);
auto Newq = Newp;
uninitialized_copy(TempVe.begin(),TempVe.end(),Newp);
cout<<endl;
for_each(Newp,Newp+3,[](const string& word){cout<<word<<endl;});