tiny_stl: :allocator之construct

空间适配器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());
}

猜你喜欢

转载自blog.csdn.net/qq_35713009/article/details/86742762
今日推荐