CUJ:标准库:Allocator能做什么?[4]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 taodm 的 blog

        std::free(p);

      }

      size_type max_size() const {

        return static_cast<size_type>(-1) / sizeof(value_type);

      }

      ...

    };

    allocate()和deallocate()成员函数处理的是未初始化的内存,它们不构造和销毁对象。语句a.allocate(1)更象malloc(sizeof(int))而不是new int。在使用从allocate()获得的内存前,你必须在这块内存上创建对象;在通过deallocate()归还内存前,你需要销毁那些对象。

    c++语言提供一个机制以在特定的内存位置创建对象:placement new。如果你写下new(p) t(a, b),那么你正在调用t的构造函数产生一个新的对象,一如你写的new t(a, b)或 t t(a, b)。区别是当你写new(p) t(a, b),你指定了对象被创建的位置:p所指向的地址。(自然,p必须指向一块足够大的内存,而且必须是未被使用的内存;你不能在相同的地址构建两个不同的对象。)。你也可以调用对象的析构函数,而不释放内存,只要写p->~t()。

    这些特性很少被使用,因为通常内存的分配和初始化是一起进行的:使用未初始化的内存是不方便的和危险的。你需要如此低层的技巧的很少几处之一就是你在写一个容器类,于是allocator将内存的分配与初始化解耦。成员函数construct()调用placement new,而且成员函数destory()调用析构函数。

    template <class t> class malloc_allocator

    {

    public:

      void construct(pointer p, const value_type& x) {

        new(p) value_type(x);

      }

      void destroy(pointer p) { p->~value_type(); }

      ...

    };

本文关键:CUJ、allocator、STL、Matt Austern
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top