首页 > 其他 > 详细

allocator类

时间:2021-05-08 16:45:24      阅读:23      评论:0      收藏:0      [点我收藏+]

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);

 

allocator类

原文:https://www.cnblogs.com/BaymaxHH/p/14743968.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!