《STL源码剖析》—— 空间配置器(二)

一。构造和析构基本工具: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()。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值