zoukankan      html  css  js  c++  java
  • 标准库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 */

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

  • 相关阅读:
    C++指针(一)
    探讨mvc下linq多表查询使用viewModel的问题
    利用aspnetPager控件加存储过程实现对gridview的分页
    Javascript 笔记
    对于最近学习WCF的总结——唔聊的服务
    今天面试的一些知识性总结
    使用C#反序列化plist文件
    Running x86 apps on WinRT devices
    ItemsSource绑定中遇到的问题
    字节对齐 详解
  • 原文地址:https://www.cnblogs.com/inevermore/p/4004655.html
Copyright © 2011-2022 走看看