侯老師--STL原始碼剖析--書中的疑問二 (轉)

worldblog發表於2007-12-09
侯老師--STL原始碼剖析--書中的疑問二 (轉)[@more@]

 

:namespace prefix = o ns = "urn:schemas--com::office" />

侯老師--STL原始碼剖析--書中的錯誤二

前言

我在看侯捷的STL原始碼剖析一書中”第二章設計一個陽春的空間器JJ::allocator(第45頁)看到了如下的虛擬碼,我認為是有錯誤的,程式碼如下:

名稱空間JJ中程式碼

……

template

inline void _construct(T1* p, const T2& value)

{

  new(p) T1(value);

}

……

template

class allocator

{

  ……

typedef T* pointer;

……

void construct(pointer p, const T& value)

{

  _construct(p,value);

}

……

}

  現在讓我們假設使用allocator空間配置器,當construct(…)時其內部委託_construct(…),這時模板_construct的T1為pointer(即int*),當執行new(p) T1(value);語句時,其變成了new int*(value)。這樣能編譯透過嗎?就算能,但它的結果不是我們所想得到的。大家認為呢?為此我看了STL的實現原始碼,發現的確和侯老師寫的不同。原始碼如下:

SGI的STL原始碼

template

struct __allocator {

  _Alloc __underlying_alloc;

 

  typedef size_t  size_type;

  typedef ptrdiff_t difference_type;

  typedef _Tp*  pointer;

  typedef const _Tp* const_pointer;

  typedef _Tp&  reference;

  typedef const _Tp& const_reference;

  typedef _Tp  value_type;

 

  template struct rebind {

  typedef __allocator<_tp1 _alloc=""> other;

  };

 

  __allocator() __STL_NOTHROW {}

  __allocator(const __allocator& __a) __STL_NOTHROW

  : __underlying_alloc(__a.__underlying_alloc) {}

  template

  __allocator(const __allocator<_tp1 _alloc="">& __a) __STL_NOTHROW

  : __underlying_alloc(__a.__underlying_alloc) {}

  ~__allocator() __STL_NOTHROW {}

 

  pointer address(reference __x) const { return &__x; }

  const_pointer address(const_reference __x) const { return &__x; }

 

  // __n is petted to be 0.

  _Tp* allocate(size_type __n, const void* = 0) {

  return __n != 0

  ? static_cast<_tp>(__underlying_alloc.allocate(__n * sizeof(_Tp)))

  : 0;

  }

 

  // __p is not permitted to be a null pointer.

  void deallocate(pointer __p, size_type __n)

  { __underlying_alloc.deallocate(__p, __n * sizeof(_Tp)); }

 

  size_type max_size() const __STL_NOTHROW

  { return size_t(-1) / sizeof(_Tp); }

 

  void construct(pointer __p, const _Tp& __val) { new(__p) _Tp(__val); }

  void destroy(pointer __p) { __p->~_Tp(); }

};

  注意加黑部分,原始碼中用的是__Tp(就是value_type),所以侯老師的_construct函式應改為如下定義:

  template

  inline void _construct(T1 p, const T2& value)

  {

  new(p) T2(value);

  }

首先宣告一下,我是非常非常崇拜侯老師的,侯老師的書寫的真的十分的棒,所以才看的仔細,但是這不代表我說的一定對,侯老師一定寫錯了。我只是把我個人的觀點寫出來,請大家批評指教,共同進步嗎!如果能夠得到侯老師的指點是再好不過了^_^。

總之,請大家多多批評指教,來信至to:來信至ccplusplus@21cn.com">ccplusplus@21cn.com。

 

  致謝!

            袁凱

           2001-11-13


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-990186/,如需轉載,請註明出處,否則將追究法律責任。

相關文章