1. 标准库allocator类及其算法

算法 说明
allocator <.T> a 定义了一个名为a的allocator对象,他可以为类型T的对象分配内存
a.allocate(n) 分配一段原始的、未构造的内存,保存n个类型为T的对象
a.deallocate(n) 释放从T*指针p中地址开始的内存,这块内存保存了n个类型为T的对象;p必须是一个先前由allocator返回的指针,且n必须是p创建时所要求的大小。调用dealocator之前,用户必须对每个在这块内存中创建的对象调用destroy
a.construct(p,args) p必须是一个类型为T*的指针,指向一块原始内存;arg被传递给类型为T的构造函数,用来在p指向的内存中构造一个对象
a.destroy§ p为T*类型的指针,此算法对p指向的对象执行析构函数

注意:

    const size_t n = 100;allocator<string> allocStr;      // object that can allocate stringsauto p = allocStr.allocate(n);   // allocate n unconstructed strings//cout << *p << endl;auto q = p; // q will point to one past the last constructed elementallocStr.construct(q++);         // *q is the empty stringcout << *(q - 1) << endl;allocStr.construct(q++, 10, 'c'); // *q is cccccccccccout << *(q - 1) << endl;//allocStr.construct(q++, "hi");    // *q is hi!//cout << *(q - 1) << endl;int nCount = 0;cout << *p << endl;  // ok: uses the string output operatorwhile (q != p) {nCount++;allocStr.destroy(--q);  // free the strings we actually allocated}cout << nCount << endl;  // ok: uses the string output operator allocStr.deallocate(p, n);  // return the memory we allocatedp = allocStr.allocate(n);   // allocate n unconstructed stringsstring s;q = p;                   // q points to the memory for first stringifstream in("E:/temp/storyDataFile");while (in >> s && q != p + n)allocStr.construct(q++, s); // construct only as many strings as we needsize_t size = q - p;         // remember how many strings we read// use the arraycout << "read " << size << " strings" << endl;for (q = p + size - 1; q != p; --q)allocStr.destroy(q);         // free the strings we allocatedallocStr.deallocate(p, n);       // return the memory we allocatedin.close();in.open("E:/temp/storyDataFile");p = new string[n];            // construct n empty stringsq = p;                        // q points to the first stringwhile (in >> s && q != p + n)*q++ = s;                 // assign a new value to *qsize = q - p;                 // remember how many strings we readcout << "read " << size << " strings" << endl;

2. "copy和填充未初始化的内存"算法

算法 说明
uninitialized_copy(b,e,b2) 将迭代器b和e之间的输入,拷贝到迭代器b2指定的未构造的原始内存中,b2指向的内存必须足够大,能够容纳输入序列中元素的拷贝
uninitialized_copy_n(b,n,b2) 同上,从b开始拷贝n个元素到b2
uninitialized_fill(b,e,t) 在迭代器b和e指定的原始内存范围中创建对象,对象的值,均为t的拷贝
uninitialized_fill_n(b,n,t) 从b指向的内存地址开始创建n个对象,b必须指向足够大的内存

使用示例:

vector<int> vi{ 1,2,3,4,5,6,7,8,9 };allocator<int> alloc;// allocate twice as many elements as vi holds
auto p = alloc.allocate(vi.size() * 2);// construct elements starting at p as copies of elements in vi
auto q = uninitialized_copy(vi.begin(), vi.end(), p);// initialize the remaining elements to 42
uninitialized_fill_n(q, vi.size(), 42);for (size_t i = 0; i != vi.size(); ++i)
cout << *(p + i) << " ";
cout << endl;for (size_t i = 0; i != vi.size(); ++i)
cout << *(q + i) << " ";
cout << endl;alloc.deallocate(p, vi.size());

retsult:

1 2 3 4 5 6 7 8 9
42 42 42 42 42 42 42 42 42

C++ Primer 5th笔记(chap 12 动态内存)allocator类相关推荐

  1. C++ Primer 5th笔记(chap 12 动态内存)智能指针概述

    1. 对象的生存期 内存类型 定义 分配和销毁时机 全局对象 程序启动时分配,程序结束时销毁 静态内存 局部static对象类static数据成员 第一次使用时分配,程序结束时销毁 栈内存 定义在函数 ...

  2. C++ Primer 5th笔记(chap 12 动态内存)shared_ptr

    1. 相关概念 1.1 使用场景 • 程序不知道自己需要使用多少对象 • 程序不知道所需对象的准确类型 • 程序需要在多个对象间共享数据 1.2 实现原理 shared_ptr对象有一个关联的计数器, ...

  3. C++ Primer 5th笔记(chap 12 动态内存)动态数组

    1. 初始化动态分配对象的数组 int *pia=new int[10]; //10个没有初始化的int int *pia2=new int[10](); //10个初始化为0的int string ...

  4. C++ Primer 5th笔记(chap 12 动态内存)unique_ptr

    1. 定义 定义一个unique_ptr时,需要将其绑定到一个new返回的指针上. unique_ptr p1; unique_ptr p2(new int(42)); 2. unique_ptr 不 ...

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

    weak_ptr是一种不控制所指向兑现生存周期的智能指针,它指向一个由shared_ptr管理的对象. 引入lock和expired是防止在weak_ptr 不知情的情况下,shared_ptr 被释 ...

  6. C++ Primer Plus学习笔记之类和动态内存分配

    前言 个人觉得学习编程最有效的方法是阅读专业的书籍,通过阅读专业书籍可以构建更加系统化的知识体系. 一直以来都很想深入学习一下C++,将其作为自己的主力开发语言.现在为了完成自己这一直以来的心愿,准备 ...

  7. C++ Primer 5th笔记(chap 19 特殊工具与技术)定位 new 表达式

    1. 定位 new (placement new) 1.1 起因 内存分配和初始化分离开 Placement new allows you to construct an object in memo ...

  8. C++学习笔记-DLL中动态内存管理

    动态内存管理 在dll中malloc的内存,必须在dll中free 注:这是由Windows自己的特点决定! 如果 a 编译成静态库,有下面两种解决方法: 1.b.dll 和 c.dll 使用同一个款 ...

  9. C++ primer 5th笔记

    目录2022年11月25日 周五 阴 第一.二章:变量和基本类型 基本内置类型 unsigned float与double 'A'与"A" 布尔类型转换时 初始化与赋值 初始化 声 ...

最新文章

  1. 循环卷积和周期卷积的关系_PSConv:多位一体、即插即用卷积单元
  2. win10蓝牙开关不见了_Win8系统电脑蓝牙图标不见了的解决方法
  3. C#遍历一个文件夹下的所有可执行文件
  4. 快速替换图片的组合-AE-样片!
  5. 使用Seq2Seq+attention实现简单的Chatbot
  6. 设置office首字母不变大小的手段
  7. 翻转单词顺序列C语言,剑指offer刷题之c、c++实现的翻转单词顺序列
  8. python面相对象编程超市系统_python面向对象编程: 面向对象版学员管理系统
  9. 股指期货首次和二次开户条件
  10. Unity用代码将多张图片合并为一张图片
  11. 数据分析报告怎么写?这5个步骤你必须了解
  12. python 画三角形matli_Python实现PS滤镜特效之扇形变换效果示例
  13. 机器学习、数据挖掘、神经网络、人工智能和模式识别之间,主要是什么关系
  14. 弗吉尼亚大学计算机就业如何,假设你是新华中学的学生李华,高中毕业后想到美国弗吉尼亚大学(University of Virginia)计算机专业深造...
  15. 转:查理·芒格:让打击和麻烦成为成长的契机
  16. Eclipse笔记-关于Maven Pom Editor的一个小问题
  17. UE4 Sequencer的事件调用
  18. Win10关闭登录面板毛玻璃效果
  19. AI Talk | AI工业质检之以图搜图引擎
  20. MQTT Web Toolkit - MQTT 在线测试工具正式发布

热门文章

  1. 【Python】青少年蓝桥杯_每日一题_9.11_买鸡
  2. Android --- Android Device Monitor 在 3.0 版本之后废弃了怎么办
  3. android升级功能键,Android 按键添加转载
  4. 各省市数据中心机房工程新建项目汇总(2021年)
  5. 广东移动数据中心攻关“液/气双通道散热技术”
  6. 通过options探测服务器信息,OPTIONS 方法在跨域请求(CORS)中的应用
  7. mysql8 修改密码_sysbench压测软件连接mysql8失败案例分析
  8. 成功解决Error:invalid character in identifier
  9. ExecutableNotFound: failed to execute ['dot', '-Tsvg'], make sure the Graphviz executables are on yo
  10. UVa 11971 - Polygon(几何概型 + 问题转换)