标准库Allocator(三)uninitialized_fill等函数的实现
前面我们使用了uninitialized_fill,来批量初始化某一段内存。
下面提供三个函数的实现代码,这三个代码的共同点是:
1.遇到错误,抛出异常
2.出现异常时,把之前构造的对象全部销毁
所以,这三个函数要么成功,要么无任何副作用。使用异常来通知使用者,所以在catch块中,处理完异常后要将异常再次向外抛出。
#ifndef MEMORY_HPP
#define MEMORY_HPP #include <iterator> template <typename ForwIter, typename T>
void uninitialized_fill(ForwIter beg, ForwIter end, const T & value)
{
typedef typename std::iterator_traits<ForwIter>::value_type VT;
ForwIter save(beg); //备份beg的初始值
try
{
for(; beg != end ; ++beg)
{
new (static_cast<void *>(&*beg))VT(value);
}
}
catch(...) //抛出异常
{
for(; save != beg; ++save)
{
save->~VT(); //逐个进行析构
}
throw; //将catch的异常再次抛出
}
} template <typename ForwIter, typename Size, typename T>
void uninitialized_fill_n(ForwIter beg, Size num, const T & value)
{
typedef typename std::iterator_traits<ForwIter>::value_type VT;
ForwIter save(beg);
try
{
for(; num-- ; ++beg)
{
new (static_cast<void *>(&*beg))VT(value);
}
}
catch(...)
{
for(; save != beg; ++save)
{
save->~VT();
}
throw;
}
} template <typename InputIter, typename ForwIter>
void uninitialized_copy(InputIter beg, InputIter end, ForwIter dest)
{
typedef typename std::iterator_traits<ForwIter>::value_type VT;
ForwIter save(dest);
try
{
for(; beg != end ; ++beg, ++dest)
{
new (static_cast<void *>(&*dest))VT(*beg);
}
}
catch(...)
{
for(; save != dest; ++save)
{
save->~VT();
}
throw;
}
} #endif /* MEMORY_HPP */
可以使用前面的代码自行测试。
标准库Allocator(三)uninitialized_fill等函数的实现的更多相关文章
- 标准库Allocator的使用(一)
上一篇我们提到了new运算符以及它的工作步骤,其实无非是把两项工作独立出来: 1.申请原始内存 2.执行构造函数 delete也涉及了两个工作: 1.执行析构函数 2.释放原始内存 其实标准库提供了另 ...
- 走进C标准库(8)——"string.h"中函数的实现相关字符串操作函数
我的strcat: char *strcat(char *dest,char *src) { char * reval = dest; while(*dest) dest++; while(*src) ...
- Go标准库学习之OS常用函数
1.OS基础操作 //获取主机名 os.Hostname() //获取当前目录 os.Getwd() //获取用户ID os.Getuid() //获取有效用户ID os.Geteuid() //获取 ...
- 【C标准库】详解feof函数与EOF
创作不易,多多支持! 再说此函数之前,先来说一下EOF是什么 EOF,为End Of File的缩写,通常在文本的最后存在此字符表示资料结束. 在C语言中,或更精确地说成C标准函式库中表示文件结束符. ...
- C++标准库之vector(各函数及其使用全)
原创作品,转载请注明出处:http://www.cnblogs.com/shrimp-can/p/5280566.html iterator类型: iterator:到value_type的访问,va ...
- c++标准库中的string常用函数总结《转》
标准C++中的string类的用法总结 相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有 ...
- Python 3标准库第三章
时间过得很快,又是一周过去了,今天感觉迷迷糊糊的,不在状态,然后,下面开始我们的讲解,还是跟大家分享一下我自己的一些想法,第一.怎么讲了,就是各位如果有怀才不遇的想法,我感觉最好不要有这种想法;第二. ...
- 走进C标准库(7)——"string.h"中函数的实现memcmp,memcpy,memmove,memset
我的memcmp: int memcmp(void *buf1, void *buf2, unsigned int count){ int reval; while(count && ...
- 走进C标准库(6)——"string.h"中函数的实现memchr
我写的memchr: void *memchr(const void *buf, char ch, unsigned count){ unsigned ; while(*(buf++) != ch & ...
随机推荐
- Python-Python及PyCharm的下载与安装
一.简介 Python:英 -[‘paɪθ ə n]或[‘paɪθɑn] 89年诞生 可用于软件开发: 游戏后台.搜索.图形界面 网站 C\S(Client/Server)软件 科学计算 亦可以进行系 ...
- Spring 的IOC 和Aop
Spring 的IOC 和Aop
- QT5.3 杂记(转)
原文转自 https://www.cnblogs.com/aoldman/p/3968280.html Qt5下,QWidget系列从QtGui中被剥离出去,成为单独的QtWidget模块.随着Qt ...
- 使用QML创建界面(转)
原文转自 https://blog.csdn.net/rl529014/article/details/51378307 在Qt编程中,我们可以使用纯C++代码,或C++和XML结合的方式来创建GUI ...
- (转)cygwin个性化配置
http://blog.cong.co/cygwin.html#%E5%AE%9A%E4%B9%89%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F配置 cygwin 中的服务 ...
- cocos2d programming guide翻译(12)
http://bbs.tairan.com/thread-807-1-1.html 导演缓冲信息支持cocos2d v0.99.4和更新的版本颜色缓冲这个默认的缓冲时RGB565.它是一个16位的缓冲 ...
- bash shell 文本文件操作
一.打开文本文档,查看文本的内容,我们最直观的方式就是用编辑器,并且可以使用vi内部的查找命令查找[参见Vim文字编辑] vi test.txt#使用vi打开当前目录下的test.txt文本 二.总结 ...
- VirtualBox安装部署的Ubuntu16.04的步骤
1.下载ubuntu16.04镜像 http://cn.ubuntu.com/download/ 以及虚拟机软件VirtualBox https://www.virtualbox.org/wiki/D ...
- Ubuntu14.04安装配置LAMP环境(php5.6)
sudo apt-get install python-software-properties sudo apt-get update sudo apt-get install vim sudo ap ...
- DB2—alter追加/删除/重置column操作
DB2—alter追加/删除/重置column操作 1.添加字段 alter table 表名称 add 字段名称 类型 Demo: 1 alter table table_name a ...