一。构造和析构基本工具:construct() 和 destroy()
#ifndef __SGI_STL_INTERNAL_CONSTRUCT_H #define __SGI_STL_INTERNAL_CONSTRUCT_H // 欲使用 placement new,需先包含此文件 #include <new.h> __STL_BEGIN_NAMESPACE // 以下是 destroy() 第一版本,接受一个指针 template <class T> inline void destroy(T* pointer) { // 调用 dtor ~T() pointer->~T(); } template <class T1, class T2> inline void construct(T1* p, const T2& value) { // placement new;调用 T1::T1(value) new (p) T1(value); } // 如果元素的数值型别(value type)有 non-trivial destructor template <class ForwardIterator> inline void __destroy_aux(ForwardIterator first, ForwardIterator last, __false_type) { for ( ; first < last; ++first) destroy(&*first); } // 如果元素的数值型别(value type)有 trivial destructor template <class ForwardIterator> inline void __destroy_aux(ForwardIterator, ForwardIterator, __true_type) {} // 判断元素的数值型别(value type)是否有 trivial destructor template <class ForwardIterator, class T> inline void __destroy(ForwardIterator first, ForwardIterator last, T*) { typedef typename __type_traits<T>::has_trivial_destructor trivial_destructor; __destroy_aux(first, last, trivial_destructor()); } // 以下是 destroy() 第二版本,接受两个迭代器。此函数设法找出元素的数值型别, // 进而利用 __type_traits<> 求取最适当措施 template <class ForwardIterator> inline void destroy(ForwardIterator first, ForwardIterator last) { __destroy(first, last, value_type(first)); } // 以下是 destroy() 第二版本针对迭代器为 char * 和 wchar_t * 的特化版 inline void destroy(char*, char*) {} inline void destroy(wchar_t*, wchar_t*) {} __STL_END_NAMESPACE #endif /* __SGI_STL_INTERNAL_CONSTRUCT_H */
这两个作为构造、析构之用的函数被设计为全局函数。
上述 construct() 接受一个指针 p 和一个初值 value ,该函数的用途就是将初值设定到指针所指的空间上。C++ 的placement new 运算符可用来完成这一任务。
destroy() 有两个版本,第一个版本接受一个指针,准备将该指针所指之物析构掉。这很简单,直接调用该对象的析构函数即可。第二版本接受 first 和 last 两个迭代器,准备将 [first, last) 范围内的所有对象析构掉。
在第二个版本 destroy() 中,首先利用 value_type() 获得迭代器所指对象的型别,在利用 __type_traits<T> 判断该型别的析构函数是否无关痛痒。若是(__true_type) ,则什么也不做就结束;若否(__false_type),这才以循环方式巡访整个范围,并在循环中每经历一个对象就调用第一个版本的 destroy()。