下面是reallocate()的简单实现:
template <class T> void VECTOR<T>::reallocate()
{
ptrdiff_t size = first_free - elements;
ptrdiff_t newCapacity = 2 * max(size, 1);
T *newElement = alloc.allocate(newCapacity);                //分配两倍内存
uninitialized_copy(elements, first_free, newElement);        //原内存元素拷贝到新内存
for (T *p = first_free; p != elements; )                    //原内存元素逆序调用析构函数
{
alloc.destroy(--p);
}
if (elements)
{
alloc.deallocate(elements, end - elements);                //撤销原内存空间
}
elements = newElement;                                        //调整新内存空间指针指向
first_free = elements + size;
end = elements + newCapacity;
}
  说明:本例只做简单说明。如果你对vector或STL实现感兴趣,可以拜读《STL源码分析》这本书,我也从这本书学到很多知识。
  2、operator new函数和operator delete函数
  当执行string *sp = new string("initialized");时发生三个步骤:
  (1)调用名为operator new的标准库函数,分配足够大的原始的未类型化的内存,以保存指定类型的一个对象。
  (2)运行该类型的一个构造函数,用指定初始化式构造对象。
  (3)返回指向新分配并构造的对象的指针。
  当执行delete sp;时发生两个步骤:
  (1)对sp指向的对象运行适当的析构函数。
  (2)调用名为operator delete的标准库函数释放该对象所用内存。
  operator new和operator delete函数有两个重载版本,每个版本支持相关的new操作:
  void *operator new(size_t);
  void *operator new[](size_t);
  void *operator delete(size_t);
  void *operator delete[](size_t);
  说明:虽然operator new和operator delete的设计意图是供new操作符使用,但它们也是标准库中的函数,可使用它们获得未构造的内存。举例如下:
  T *newElement = alloc.allocate(newCapacity);                //分配两倍内存
  T *newElement = static_cast<T*>(operator new[](sizeof(T) * newCapacity));
  上面两条语句是等价的,下面这两条语句也是等价的。
  alloc.deallocate(elements, end - elements);                //撤销原内存空间
  operator delete[](elements);
  说明:allocator类分配类型化的内存,使用时不必计算以字节为单位所需的内存,也避免对operator new的返回值进行强制类型转换。比直接使用operator new,operator delete更为安全。
  二、对象构造和撤销
  C++提供了不同方法在原始内存中构造和撤销对象:
  (1)allocator类的成员construct和destroy。
  (2)定位new表达式。
  (3)直接调用对象的析构函数撤销对象。撤销对象并不释放对象所在的内存。
  (4)算法uninitialized_copy和uninitialized_fill构造对象。
  下面主要介绍定位new表达式(其他情况我们都见过了)。
  定位new表达式在已分配的原始内存中初始化一个对象,它不分配内存,接受指向已分配但未构造内存的指针,并在该内存中初始化一个对象。定位new表达式的形式是:
  new (place_address) type
  new (place_address) type(initializer-list)
  其中place_address必须为指针,initializer-list提供了一个可能为空的初始化列表。举例如下:
  alloc.construct(first_free, t);
  new (first_free) T(t);
  string *sp = alloc.allocate(2);
  new (sp) string(b, e);
  注意:
  (1)定位new表达式初始化一个对象时,可使用任何构造函数,并直接建立对象。allocator类的construct成员总是使用拷贝构造函数。
  (2)对于值类型而言,直接构造对象与构造临时对象并进行拷贝没有什么区别,性能差别基本没什么意义。但对某些类而言,使用拷贝构造函数是不可能的(拷贝构造函数可能是私有的等),或应该避免的。这种情况,或许你应该考虑定位new表达式。