标准库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 */

可以使用前面的代码自行测试。

转载于:https://www.cnblogs.com/inevermore/p/4004655.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值