空间适配器allocator有两部分操作,一个是空间配置和释放,另一个就是构造和析构。相比复杂的内存分配,构造器的实现要轻松得多,因为它本质上完成了构造对象的一些对接工作,并未真正的碰到内存数据。
构造器construct()只做了一件十分简单的事,即将指针和值关联起来,值存在于一个地址空间,指针是我们用类型关键字声明的,construct只需要让指针指向这个空间就可以了,这个操作可以由placement new运算子来完成,具体代码如下:
template<class T1, class T2>
void construct(T1 *ptr1, const T2& value)
{
new (ptr1) T1(value);
}
关于析构函数的实现,由于要考虑到标准类型和自定义类型的析构方式不同,要用到特性萃取来获取POD特性。判断出类型不是标准布局类型时,以迭代器的方式遍历和释放,以此泛化析构方法。
template<class T>
void destroy(T *ptr)
{
ptr->~T();
}
template<class ForwardIterator>
void _destroy(ForwardIterator first, ForwardIterator last, _true_type) {}
template<class ForwardIterator>
void _destroy(ForwardIterator first, ForwardIterator last, _false_type)
{
for (; first != last; first++)
{
destroy(&*first);
}
}
template<class ForwardIterator>
void destroy(ForwardIterator first, ForwardIterator last)
{
typedef typename _type_traits<ForwardIterator>::is_POD_type is_POD_type;
_destroy(first, last, is_POD_type());
}