标准库Allocator(三)uninitialized_fill等函数的实现

时间:2014-10-03 02:33:33   收藏:0   阅读:324

前面我们使用了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 */

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

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!