allocator类

来源:互联网 发布:mac官网海淘 编辑:程序博客网 时间:2024/06/05 19:01

new有一些灵活性的局限,其中一方面表现在它将内存分配和对象构造组合在了一起。类似的,delete将对象析构和内存释放组合在了一起。我们分配单个对象时,通常希望将内存分配和对象初始化组合在一起。因为在这种情况下,我们几乎肯定知道对象应有什么值。

当分配一大块内存时,我们通常计划在这块内存上按需构造对象。在此情况下,我们希望将内存分配和对象构造分离。这意味着我们可以分配大块内存,但只在真正需要时才真正执行对象创建操作(同时付出一定开销)。

一般情况下,将内存分配和对象构造组合在一起可能会导致不必要的浪费,例如:

string* const p = new string[n];    // 构造n个空stringstring s;string* q = p;while (cin >> s && q != p + n)    *q++ = s;const size_t size = q - p;      // 记住读取了多少个stringdelete [] p;    // p指向一个数组;记得用delete[]来释放

new表达式分配并初始化了n个string。但是,我们可能不需要n个string,少量string可能就足够了。这样,我们就可能创建了一些永远也用不到的对象。而且,对于那些确实要使用的对象,我们也在初始化之后立即赋予了它们新值。每个使用到的元素都被赋值了两次:第一次是在默认初始化时,随后是在赋值时。

更重要的是,那些没有默认构造函数的类就不能动态分配数组了。
allocator类
allocator类提供一种类型感知的内存分配方法,它分配的内存是原始的、未构造的。allocator是一个模板,为了定义一个allocator对象,我们必须指明这个allocator可以分配的对象类型。当一个allocator对象分配内存时,它会根据给定的对象类型来确定恰当的内存大小和对齐位置:

allocator<string> alloc;    // 可以分配string的allocator对象auto const p = alloc.allocate(n);   // 分配n个未初始化的string

allocator分配未构造的内存
allocator分配的内存是未构造的(unconstructed)。我们按需在此内存中构造对象。在新标准库中,construct成员函数接受一个指针和零个或多个额外参数,在给定位置构造一个元素。额外参数用来初始化构造的对象。

另外需要注意的是:在还未构造对象的情况下使用原始内存是错误的。
当我们用完对象后,必须对每个构造的元素调用destroy来销毁它们。函数destroy接受一个指针,对指向的对象执行析构函数。
我们只能对真正构造的元素进行destroy操作。

0 0
原创粉丝点击