【STL】construct()和destroy()

本文深入探讨了STL中的全局构造和析构函数,包括如何使用定位new进行对象构造,以及析构对象的不同版本和场景。还介绍了uninitialized_copy等其他三个全局函数的用途,以及它们在不同情况下的重载版本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STL定义了五个全局函数,作用于未初始化的空间上。
其中两个全局函数construct()和destroy()负责对象的构造和析构,它们隶属于STL标准规范。

构造对象直接使用定位new:
template <class T1, class T2>
inline void construct(T1* p, const T2& value) {
  new (p) T1(value);    // 定位new
}


析构对象分多个版本
版本1:
template <class T>
inline void destroy(T* pointer) {
    pointer->~T();   // 直接调用析构函数
}


版本2:
template <class ForwardIterator>
inline void destroy(ForwardIterator first, ForwardIterator last) {
  __destroy(first, last, value_type(first));
}


它调用:
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());
}


再根据对象有无必要析构分别调用:
template <class ForwardIterator>
inline void
__destroy_aux(ForwardIterator first, ForwardIterator last, __false_type) {     // non-trivial destructor
  for ( ; first < last; ++first)
    destroy(&*first);   // 逐个调用析构函数
}
 
template <class ForwardIterator> 
inline void __destroy_aux(ForwardIterator, ForwardIterator, __true_type) {}    // trivial destructor


另外还有两个版本2的重载版本:
// 两个重载版本,无需析构
inline void destroy(char*, char*) {}
inline void destroy(wchar_t*, wchar_t*) {}


很显然,对象为字符,则什么也不做。


另外三个全局函数:
  • uninitialized_copy
  • uninitialized_fill
  • uninitialized_fill_n
这三个函数都有不同的重载版本,根据元素是否为POD(传统C struct类型),执行相应的操作,或者直接memmove(),或者调用STL泛型函数,或者分别对每个元素调用构造函数。P77的图已经概括的非常好了。详情参见《“类型萃取器”__type_traits》。

参考:
《STL源码剖析》 P51、P70.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值