new 有一些灵活性上的局限,其中一方面表现在它将内存分配和对象构造组合在了一起。类似的,delete将对象析构和内存释放组合在了一起,我们分配单个对象时,通常希望将内存分配和对象初始化组合在一起。因为在这种情况下,我们几乎肯定直到对象应有什么值。
当分配一大块内存时,我们通常计划在这块内存上按需构造对象,在此情况下,我们希望将内存分配和对象构造分离。这意味着我们可以分配大块内存,但只在真正需要时才真正执行对象创建操作。

allocator类

标准库allocator类型定义在头文件memory中,它帮助我们将内存分配和对象构造分离开。它提供一种类型感知的内存分配方法,它分配的内存是原始的、未构造的。

  • allocator<T> a:定义一个名为a的allocator对象,它可以为类型为T的对象分配内存
  • a.allocator(n):分配一段原始的、未构造的内存,保存n个类型未T的对象
  • a.deallocator(p,n):释放从T*指针p中地址开始的内存,这块内存保存了n个类型未T的对象;p必须是一个先前由alloator返回的指针,且n必须是p创建时所要求的大小。在调用deallocator之前,用户必须对在这块内存中创建的对象调用destroy
  • a.construct(p,args):p必须时一个类型为T*的指针,指向一个原始内存;arg被出啊递给类型为T的构造函数,用来在p指向的内存中构造一个对象
  • a.destroy§:p为T*类型的指针,此算法对p指向的对象执行析构函数
allocator<string> alloc;//可以分配n个string的allocator对象
auto const p=alloc.allocator(n);//分配n个未初始化的string

allocator分配为构造的内存

allocator分配的类是未构造的。我们按需在此内存中构造对象。在新标准中。construct 成员函数接受一个指针和零个或多个额外参数,在给定位置构造一个元素。二外参数用来初始化构造的对象。类似make_shared的参数,这些额外参数必须是与构造的对象的类型匹配的合法的初始化器

auto q=p;//q指向最后构造的元素之后的位置
alloc.construct(q++);//*q为空字符串
alloc.construct(q++,10,'c');//*q为cccccccccc
allocator.construct(q++,'hi');//*q为hi

当我们用完对象后,必须对每个构造的元素调用destroy来销毁他们。函数destroy接受一个指针,对指向的对象执行析构函数。

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

一旦元素被销毁后,就可以宠幸使用这部分内存来保存其他的string,也可以将其归还给系统,释放内存通过调用deallocator来完成

alloc.deallocator(p,n);

拷贝和填充未初始化内存算法

  • uninitialized_copy(b, e, b2)从迭代器b和e指出的输入范围中拷贝元素到迭代器b2指定的未构造的原始内存中。b2指向的内存必须足够大,能容纳输入序列中元素的拷贝
  • uninitialized_copy_n(b,n,b2):从迭代器b指向的元素开始,拷贝n个元素到b2开始的内存中
  • unintialized_fill(b,e,t):在迭代器b和e指定的原始内存范围内创建对象,对象的值均为t的拷贝
  • uninitialized_fill_n(b,n,t):从迭代器b指向的内存地址开始创建n个对象。b必须指向足够大的为构造的原始内存,能够容纳给定数量的对象
    假定一个int的vector,希望将其内容拷贝到动态内存中。我们将分配一块比vector中元素所占空间大一倍的动态内存,然后将原vector中的元素拷贝到前一半空间,对后一半空间用一个给定值填充
auto p= alloc.alloate(v1.size()*2);
auto q=nuninitialized_copy(vi.begin(),vi.end(),p);
uninitialized_fill_n(q.vi.size(),42);

allocator 类相关推荐

  1. C++ Primer 5th笔记(chap 12 动态内存)allocator类

    1. 标准库allocator类及其算法 算法 说明 allocator <.T> a 定义了一个名为a的allocator对象,他可以为类型T的对象分配内存 a.allocate(n) ...

  2. allocator类编程实验

    allocator类编程实验 基本知识 allocator uninitialized_copy.uninitialized_fill等函数 示例程序 示例代码 usealloc.cpp useall ...

  3. 【C++11新特性】 - 空间配置allocator类

    原文链接 http://blog.csdn.net/Xiejingfa/article/details/50955295 今天我们来讲讲C++的allocator类. C++提供了new和delete ...

  4. allocator类初学的简单例子

    在C++中,我们基本用new(delete)操作符分配(释放)内存.new操作符为特定类型分配内存,并在新分配的内存中构造该类型的一个对象.new表达式自动运行合适的构造函数来初始化每个动态分配的类类 ...

  5. C++学习之allocator类

    本文结合该网友的整合的:https://blog.csdn.net/Xiejingfa/article/details/50955295 在介绍allocator类之前,先介绍一下new和delete ...

  6. allocator类

      最近看动态内存时候准备细细了解一下allocator,记录       基本印象   new有一些灵活性上的局限,其中一方面表现在它将内存分配和对象构造组合在了一起,类似的,delete将对象析构 ...

  7. c++ allocator类

    目录 std::allocator::allocate c++中的allocator类 概述 allocator用法 详解 allocate用于分配原始内存 Return value 在STL中也会用 ...

  8. allocator 类的使用方法

    new分配内存并且构造对象 delete释放内存并且析构对象 注意delete删除指向动态数组的指针 1 #include <iostream>2 #include <cstring ...

  9. C++ 的 allocator类 提供类型化的内存分配以及对象的分配和撤销

    在没有深入的叙述本文之前先来几个引子 C++中的allocator 提到了rebind,而boost库中也有一个boost::bind 慢慢琢磨吧.留个记忆体.以后还会看这些东西的 memory po ...

最新文章

  1. ICCV2021|首届城市规模点云语义理解挑战赛启动了
  2. 深刻剖析与实战BCELoss详解(主)和BCEWithLogitsLoss(次)以及与普通CrossEntropyLoss的区别(次)
  3. 转入肥胖基因改造RNA,作物增产50%
  4. kd树的根节点_kd树总结
  5. PCB为什么要做无盘设计及其在Allegro中的具体操作
  6. java命令运行class文件提示错误:找不到或无法加载主类
  7. 牛客 contest893 G-Truthman or Fakeman
  8. pytorch l2正则化_吴恩达深度学习 编程作业六 正则化(2)
  9. 论文笔记:Few-Shot Segmentation Without Meta-Learning : A Good Transductive Inference Is All You Need
  10. QT 处理TCP粘包问题
  11. 【OGG】OGG故障错误处理总结
  12. Python关于节假日的一些处理
  13. 数学几何定理 与 13个基本不等式
  14. 橡胶软接头的安装及使用说明
  15. PAT A1096
  16. Spring Boot当中获取request的三种方式
  17. 模具分类以及塑胶模具设计流程
  18. JZOJ 7066. 【2021.4.24 NOI模拟】ehzeux与圆周(DP)
  19. 初识linux之vim工具与bdb调试工具
  20. 【BP回归预测】基于matlab随机蛙跳算法SFLA优化神经网络数据回归预测【含Matlab源码 2272期】

热门文章

  1. 2023牛客寒假算法基础集训营5(通过ABCDHIKL) I题有详解(F已补)
  2. 从视频到音频:使用VIT进行音频分类
  3. 如何在日常工作中提升技术能力
  4. 2020最全影视站解析接口
  5. where和having、sql语句执行顺序
  6. linux 中jdk的下载与安装
  7. B站尚硅谷HTMLCSS核心基础教程全笔记
  8. 服务器系统安装与设置方法,服务器系统安装与设置
  9. 在线时间戳转换工具的坑-同样的时间戳转为北京时间,转换结果受本机时区设置的影响...
  10. excel 画散点图 怎么设置图片的分辨率_Excel处理临床数据:图表篇