STL定义有五个全局函数,作用于未初始化空间上,这样的功能对于容器的实现很有帮助。前两个函数是用于构造的construct()和用于析构的destroy(),另三个函数是uninitialized_copy(),uninitialized_fill(),uninitialized_fill_n,分别对应于高层次函数copy()、fill()、fill_n()——这些都是STL算法。

1 uninitialized_copy

template <class InputIterator,class ForwardIterator>

ForwardIterator uninitialized_copy(InputIterator first,InputIterator last,ForwardIterator result);

uninitialized_copy()使我们能够将内存的配置和对象的构造行为分离开来,如果作为输出目的地的[result,result+(last-first))范围内的每一个迭代器都指向为初始化区域,则uninitialized_copy()会使用copy constructor,给身为输入来源之[first,last)范围内的每一个对象产生一份复制品,放进输出范围中。换句话说,针对输入范围内的每一个迭代器i,该函数会调用construct(&*(result+(i-first)),*i),产生*i的复制品,放置于输出范围的相对位置上。

如果你需要实现一个容器,uninitialized_copy()这样的函数会为你带来很大的帮助,因为容器的全区间构造函数通常以两个步骤完成:

  • 配置内存块,足以包含范围内的所有元素
  • 使用uninitialized_copy(),在该内存区块上构造元素。

C++标志规格书要求uninitialized_copy()具有“commit or rollback”语意,意思是要么“构造出所有必要的元素”,要么(当有任何一个copy constructor失败时)“不构造任何东西。

2 uninitialized_fill

template <class ForwardIterator,class T>

ForwardIterator uninitialized_fill(ForwardIterator first,ForwardIterator last,const T& x);

uninitialized_fill()也能够使我们将内存配置与对象的构造行为分离开来。如果[first,last)范围内的每个迭代器都指向未初始化的内存,那么uninitialized_fill()会在该范围内产生x(上式第三个参数)的复制品。换句话说,uninitialized_fill()会针对操作范围内的每个迭代器i,调用construct(&*i,x),在i所指之处产生x的复制品。

与uninitialized_copy()一样,uninitialized_fill()必须具备“commit or rollback”语意,换句话说,它要么产生出所有必要元素,要么不产生任何元素,如果有任何一个copy constructor丢出异常(exception),uninitialized_fill(),必须能够将已产生的所有元素析构掉。

3 uninitialized_fill_n

template <class ForwardIterator,class Size,class T>

ForwardIterator uninitialized_fill_n(ForwardIterator first,Size n,const T& x);

uninitialized_fill_n()能使我们将内存配置与对象构造行为分离开来,它会为指定范围内的所有元素设定相同的初值。

如果[first,first+n)范围内的每一个迭代器都指向未初始化的内存,那么uninitialized_fill_n()会调用 copy constructor,在该范围内产生x(上式第三个参数——的复制品。也就是说,面对[first,first+n)范围内的每个迭代器i,uninitialized_fill_n()会调用construct(&*i,x),在对应位置产生x的复制品。

uninitialized_fill_n()也具有“commit or rollback”语意:要么产生所有必要的元素,否则就不产生任何元素。如果任何一个copy constructor丢出异常(exception),uninitialized_fill_n()必须析构已产生的所有元素。

以下分别介绍这三个函数的实现法,其中所呈现的iterators(迭代器)、value_type()、_type_traits、_true_type、_false_type、is_POD_type等实现技术,都在后面介绍。

STL——内存基本处理工具相关推荐

  1. linux c 内存泄露 检查工具

    Linux下编写C或者C++程序,有很多工具,但是主要编译器仍然是gcc和g++.最近用到STL中的List编程,为了检测写的代码是否会发现内存泄漏,了解了一下相关的知识. 所有使用动态内存分配(dy ...

  2. Linux下几款C++程序中的内存泄露检查工具

    Linux下编写C或者C++程序,有很多工具,但是主要编译器仍然是gcc和g++.最近用到STL中的List编程,为了检测写的代码是否会发现内存泄露,了解了一下相关的知识. 所有使用动态内存分配(dy ...

  3. Ubuntu下内存泄露检测工具Valgrind的使用

    在VS中可以用VLD检测是否有内存泄露,可以参考http://blog.csdn.net/fengbingchun/article/details/44195959,下面介绍下Ubuntu中内存泄露检 ...

  4. 内存泄漏检测工具VLD在VS2010中的使用举例

    Visual LeakDetector(VLD)是一款用于Visual C++的免费的内存泄露检测工具.它的特点有:(1).它是免费开源的,采用LGPL协议:(2).它可以得到内存泄露点的调用堆栈,可 ...

  5. 系统内存信息获取工具类

    /** * 得到系统内存信息的工具类 * @author zwenkai */ public class SystemInfoUtils { /** * 得到运行的进程总个数 * * @param c ...

  6. github snap android,GitHub - albuer/heapsnap: HeapSnap 是一个定位内存泄露的工具,适用于Android平台。...

    HeapSnap 1.HeapSnap 是什么 HeapSnap 是一个定位内存泄露的工具,适用于Android平台. 主要特性如下: 对系统负载低 不需要修改目标进程的源代码 支持Andoroid上 ...

  7. 内存泄露检测工具之DMalloc

    dmalloc用法快速入门 dmalloc是一个简单易用的C/C++内存leak检查工具,以一个运行库的方式发布. dmalloc能够检查出直到程序运行结束还没有释放的内存,并且能够精确指出在 哪个源 ...

  8. 内存泄漏检测工具(转载)

    内存泄漏检测工具2007年08月08日 1.     ccmalloc-Linux和Solaris下对C和C++程序的简单的使用内存泄漏和malloc调试库. 2.     Dmalloc-Debug ...

  9. VC内存泄露检查工具:Visual Leak Detector

    www.diybl.com 时间:2009-04-12 作者:匿名 编辑:sky 初识Visual Leak Detector        灵活自由是C/C++语言的一大特色,而这也为C/C++程序 ...

最新文章

  1. GameBryo Shader 组织方式
  2. windows 技术篇 - cmd命令查看当前目录下的所有文件和文件夹以及所有子目录下的文件,dir命令的使用方法
  3. 利用Keras构建自动编码器
  4. leetcode-9-回文数
  5. Struts01---入门小案例
  6. ELK之elasticsearch5.6的安装和head插件的安装
  7. AndroidStudio+ideasmali动态调试smali汇编
  8. linux开源游戏_2014年杰出的开源和Linux游戏
  9. 一,数据库基础,MySQL安装,配置文件,语法
  10. @Cotroller和@RestCotroller
  11. WinDBG中设置条件断点
  12. 文本编辑框鼠标丢失问题
  13. httpSession和Cookie
  14. 开源一套基于 React Naitve 的业务驱动型 UI 组件库:react-native-atlas
  15. matlab朴素贝叶斯手写数字识别_「深度学习系列」PaddlePaddle之手写数字识别
  16. 利用 adb 对手机进行屏幕分辨率设置
  17. 移动直播技术秒开优化经验
  18. mysql那本书适合初学者_8本书让你成为一个更加开放的领导者
  19. Java面试题-JVM 和服务器性能评估
  20. jQuery筛选-文档处理

热门文章

  1. ASP .NET Core Web MVC系列教程二:添加控制器
  2. php中perl配置,配置Apache及运行perl,php
  3. idea中使用docker插件部署项目
  4. C++搞懂深拷贝初始化=与赋值(运算符重载)=的区别
  5. 京津冀计算机学科大学排名,2021京津冀地区大学排名!北师大第3,北航第7,人大不敌天大?...
  6. 强烈推荐16 款牛逼的 IDEA 插件,让你开发速度飞起来!
  7. Python游戏开发,pygame模块,Python实现愤怒的小鸟【附带源码】
  8. 数据分析从零开始实战,Pandas读写Excel/XML数据
  9. jemeter多场景混合案例_Jmeter多业务混合场景如何设置各业务所占并发比例
  10. Note:HTTP服务器是如何实现对PHP支持的