首页 > 代码库 > 标准库Allocator(三)uninitialized_fill等函数的实现
标准库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等函数的实现
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。