首页 > 其他 > 详细

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

时间:2014-10-03 00:54:23      阅读:355      评论:0      收藏:0      [点我收藏+]

前面我们使用了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等函数的实现

原文:http://www.cnblogs.com/inevermore/p/4004655.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!