天天看点

c++动态数组(二)之allocator类allocator类

new在灵活性上面一些局限性,以方便它将内存分配和对象构造组合在了一起,delete将内存释放和对象析构组合在一起。

当分配一大块内存时,我们通常计划在这块内存上面按需构造对象。在这种情况下,我们希望内存分配和对象构造分离。这意味着我们可以分配大块内存,但只有在真正需要时才真正执行对象创建操作。

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

更重要的是,那些没有默认构造函数的类就不能动态分数组了。

allocator类

它帮助我们将内存分配和对象构造分离开来。

为了定义一个allocator对象,我们必须知名这个allocator可以分配的对象类型。

allocator<string> alloc;
    auto const p = alloc.allocate();//分配10个未初始化的string
           

allocator分配未构造的内存

allocator<string> alloc;
auto const p = alloc.allocate();//分配10个未初始化的string
auto q = p;//q指向最后构造的元素之后的位置

alloc.construct(q);
cout << *q << endl;//*q是空字符串
q++;
alloc.construct(q,,'c');//*q是cccccccccc
cout << *q << endl;
q++;
alloc.construct(q, "hi");//*q是hi
cout << *q << endl;
           

当我们用完对象时,必须对每个构造的元素调用destroy来销毁他们。destroy接收一个指针

while(q!=p){
    alloc.destroy(--q);//释放我们真正构造的string
}
           

q指向最后构造的元素之后的位置。

一旦元素被销毁之后,我们就可以重新使用这部分内存来保存其他string。释放内存通过调用deallocate来完成。

继续阅读