标签:
当分配一大块内存时,我们通常计划在这块内存上按需构造对象,这样的我们希望将内存分配和对象构造分离。但是通常的new关键字的分配的动态空间,有时候会造成一些浪费,更致命的是“如果一个类没有默认构造函数,那么这个类就不能动态分配数组了”。
这时我们需要一个能将内存分配和对象构造分离的机制,allocator很好地帮助我们解决了这个问题。
#include 《memory》,allocator提供了一种类型感知的内存分配方法,它分配的内存是原始的,未构造的。我们可以利用allocator提供的操作对这些内存进行操作,
allocator<T> a | 定义了一个名为a的allocator对象,它可以为类型为T的对象分配内存 |
a.allocator(n) | 先定义,后分配。这分配一段原始的,未构造的,保存n个类型为T的对象;----》可以看出alllocator方法分配内存,也是先定义类型,在分配类型的数量 |
a.deallocat(p,n) |
note,在此操作之前,必须堆每个在这个内存中创建的对象调用destory方法。 释放从T*,这块内存保存了n类型为T的对象,p必须是一个先前由allocator返回的指针.且n必须是p创建时所要求大小,在调用deallocator之前,用于必须堆每个在这块内存中创建的对象调用destroy方法 |
a.construct(p,args) | p必须是一个T*的指针,指向一个块原始内存,args被传递给类型为T的构造函数,用在在p指向的内存中构造一个对象 |
a.destroy(p) | p为类型为T*的指针,此方法堆p所指对象执行析构函数 |
allocator<string> alloc; auto const p = alloc.allcoate(n); auto q = p; alloc.construct(q++);//*q is a null string alloc.construct(q++,10,‘c‘)// *q is cccccccccc alloc.construct(q++,"hi")//*q is hi 在未构造对象的情况下,就使用原始内存是错误的 例如 cout<<*p<<endl; cout<<*q<<endl;//这个是非法的 记住,为了使用allcocate返回的内存,我们必须用construct构造对象,使用未构造的函数,其行为是未定义的. 党我们使用完对象后,必须堆每个构造函数调用destroy来销毁 while(q!=p){ alloc.destroy(--q); }//我们只能堆真正构造了的元素进行destroy操作
//一旦元素被销毁后,我们重新使用这部分内存来保存其他string,
//也可以将内存归还给os,释放内存是通过deallocate(p,n)来完成的
alloc.deallocate(p,n);
拷贝/填充未初始化的算法,STL还定义了两个伴随算法,可以在未初始化内存中创建对象
uninitialized_copy(b,e,b2) | 从迭代器b和e指出的输入范围拷贝元素到迭代器b2指定的未构造的原始原始内存中,b2指向的内存必须足够大,能容纳输入序列中元素的拷贝 |
uninitiated_copy(b,n,b2) | |
uninitiated_fill(b,e,t) |
在迭代器b和e指定的原始内存范围中创建对象,对象的值均为t的拷贝 |
uninitiated_fill(b,n,t) |
/* 假定有一个例子,希望将其内容拷贝到动态内存中,我们将分配一块比vector中元素空间大一倍的动态内存,然后将原vector中的元素拷贝到前一半空间,后一半空间利用一个给定值进行填充 */ auto p = alloc.allocate(vi.size()*2); auto q = uninitiated_copy(vi.begin(),vi.end(),p); uninitiated_fill(q,vi.size(),42);
标签:
原文地址:http://www.cnblogs.com/li-daphne/p/5451786.html