构造和析构的基本工具:constuct()和destroy()

1659阅读 0评论2011-10-13 lthyxy
分类:C/C++

  1. //<stl_construct.h>的部分内容

  2. #include <new.h>

  3. template <typename T1,typename T2>
  4. inline void construct (T1 *p, const T2& value)
  5. {
  6.   new(p) T1(value);//调用T1::T1(value);
  7. }

  8. template <typename T>
  9. inline void destroy (T * pointer)
  10. {
  11.   pointer->~T();//调用~T();最终都调用这个版本的.
  12. }

  13. template <typename ForwardIterator>
  14. inline void destory (ForwardIterator first, ForwardIterator last)
  15. {
  16.   _destroy(first, last, value_type(first)); //调用_destroy,还传进元素的类型
  17. }

  18. template <typename ForwardIterator,typename T>
  19. inline _destroy(ForwardIterator first, ForwardIterator last, T*)
  20. {
  21.   typedef typename _type_trait<T>::has_trivial_destructor trivial_destructor;
  22.   _destroy_aux(first,last,trivial_destructor());//调用_destory_aux,判断是否有trivial destructor
  23. }//trivial destructor 语义可以看Inside The C++ Object Model

  24. template <typename ForwardIterator>
  25. inline void _destory_aux (ForwardIterator first, ForwardIterator last, _true_type)
  26. {
  27.   //如果有 trivial destructor 就什么也不做.
  28. }

  29. template <typename ForwardIterator>// 没有trivial destructor,逐个destroy
  30. inline void _destory_aux (ForwardIterator first, ForwardIterator last, _false_type)
  31. {
  32.    for ( ;first < last; ++first)
  33.       destroy(&*first);
  34. }

  35. inline void destroy( char* ,char *) {}//对char跟wchar_t的特化版
  36. inline void destroy(wchar_t *,wchar_t *){}
//知道有这玩意之后就不会在CSDN看着他们争那题会不会内存泄漏了,虽然标准说行为未定义.但是真的实现怎么实现的后//就能对自己写的代码的行为有更加好的掌控,

上一篇:一个简单的空间置配器.
下一篇:SGI 第一级置配器 _malloc_alloc_template 剖析