stl_construct定义了全局函数construct()和destroy(),负责对象的构造和析构。在内存上的算法还依赖于两个全局函数,construct()和destroy(),前者负责在指定的内存上调用对象的构造函数,在内存上构造出对象。后者则是相反,在指定内存上调用对象的析构函数,销毁对象。(注意:这两个函数不涉及对象内存的分配和释放,对象构造在指定的已分配好的内存上,析构也只是销毁对象,对于对象占用的那块内存,没有释放,如需释放,还需自己去free)。
stl_construct.h中提供了两种对象的construct构造方法,默认构造和赋值构造.
在stl_construct.h中的destroy,STL会分析迭代器所指对象的has_trivial_destructor特性的类型(只有true_type和false_type),如果是true_type,STL就什么都不做;如果是false_type,就会调用每个对象的析构函数来销毁这组对象。stl_construct还为一些基本类型的对象提供了特化版本的destroy函数,这些基本类型分别是char, int, float, double, long。
stl_construct.h源码:
// Filename: stl_construct.h // Comment By: 凝霜 // E-mail: [email protected] // Blog: http://blog.csdn.net/mdl13412 /* * * Copyright (c) 1994 * Hewlett-Packard Company * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, * provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in supporting documentation. Hewlett-Packard Company makes no * representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied warranty. * * * Copyright (c) 1996,1997 * Silicon Graphics Computer Systems, Inc. * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, * provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in supporting documentation. Silicon Graphics makes no * representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied warranty. */ /* NOTE: This is an internal header file, included by other STL headers. * You should not attempt to use it directly. */ #ifndef __SGI_STL_INTERNAL_CONSTRUCT_H #define __SGI_STL_INTERNAL_CONSTRUCT_H #include <new.h> // 需要placement new的原型 __STL_BEGIN_NAMESPACE // 调用成员的析构函数, 需要类型具有non-trivial destructor template <class T> inline void destroy(T* pointer) { pointer->~T(); } // 使用placement new在已经分配的内存上构造对象 // 如果你不熟悉placement new, 请参考 // http://msdn.microsoft.com/en-us/library/kewsb8ba.aspx // http://blogs.msdn.com/b/jaredpar/archive/ // 2007/10/16/c-new-operator-and-placement-new.aspx template <class T1, class T2> inline void construct(T1* p, const T2& value) { new (p) T1(value); } // 析构一组对象, 用于具有non-trivial destructor template <class ForwardIterator> inline void __destroy_aux(ForwardIterator first, ForwardIterator last, __false_type) { for ( ; first < last; ++first) destroy(&*first); } // 如果没有类型non-trivial destructor, 则使用此函数 template <class ForwardIterator> inline void __destroy_aux(ForwardIterator, ForwardIterator, __true_type) {} // 使用traits技术, 判断类型是否就有non-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()); } //////////////////////////////////////////////////////////////////////////////// // 用于销毁一组对象 //////////////////////////////////////////////////////////////////////////////// // char *特化版本 // ---------- destroy不进行析构 // | // destroy(first, last) -------------------------- 特化 // | | // | 泛化 ----------- destroy不进行析构 // | wchar_t *特化版本 // ↓ // 调用 __destroy(first, last, value_type(first)); // 根据是否具有trivial destructor进行函数转发 // | // |---------------- has trivial destructor? // | // ------------------------------------------- // No | | Yes // | | // ↓ ↓ // __destroy_aux(..., __true_type) __destroy_aux(..., __false_type) // 不进需要行析构操作 for ( ; first < last; ++first) // destroy(&*first); //////////////////////////////////////////////////////////////////////////////// template <class ForwardIterator> inline void destroy(ForwardIterator first, ForwardIterator last) { __destroy(first, last, value_type(first)); } // 特化版本 inline void destroy(char*, char*) {} inline void destroy(wchar_t*, wchar_t*) {} __STL_END_NAMESPACE #endif /* __SGI_STL_INTERNAL_CONSTRUCT_H */ // Local Variables: // mode:C++ // End: