new能够将内存分配和对象构造 结合一起,delete将对象析构和内存释放结合在一起。但是当希望将内存分配和对象构造分离时,即分配大内存,当真正需要时才进行对象的构造,我们可以使用allocator。
对象和构造组合在一起可能会导致不必要的浪费
标准库中allocator在memory头文件中,他帮助我们将内存分配和对象构造分离开。分配的内存是原始未构造的。
allocator<string> alloc; // 可以分配string的allocator对象 auto const p = alloc.allocate(n); // 分配n个未初始化的string
allocator<T> a 定义一个a的allocator对象,它的类型为T的对象分配内存 a.allocate(n) 分配一段原始的未构造的内存,保存n个类型的T的对象 a.deallocate(p, n) 释放从T*指针p中地址 开始的内存,这块内存保存了n个类型为T的对象;p必须是先前有allocate返回的指针,且n必须是p创建时所要求的大小。在调用deallocate之前,用户必须对每个在这块内存中创建的对象调用destroy a.construct(p, args) p必须是一个类型为T*的指针,指向一块原始内存;args被传递给类型为T的构造函数,用来在p指向的内存构造一个对象 a.destroy(p) p是T*类型的指针,此算法对p指向的对象执行析构函数
allocator分配的内存是未构造,因此需要根据需要在内存构造对象。在新标准库中,construct成员函数接受一个指针和零个或多个额外参数,在给定位置构造一个元素。额外参数用来初始化构造对象。
auto q = p; alloc.construct(q++); // *q为空字符串 alloc.construct(q++, 10, ‘c‘); alloc.construct(q++, "hi"); cout<< *p << endl; // 指向第一个元素 cout << *q << endl; // q所指向的内存未构造对象
while (q != p) {
alloc.destory(--q); //对构造的对象进行析构,只能析构已经构造对象的内存
}
一旦元素被销毁后,就可以重新使用这部分内存来保存其他string,也可以将其归还给系统。释放内存通过调用deallocate来完成
alloc.deallocate(p, n);
原文:https://www.cnblogs.com/BaymaxHH/p/14743968.html