首先介绍new
表达式和delete
表达式的工作机理:
// new表达式
string* sp = new string("a value"); // 分配并初始化一个string对象
string* arr = new string[10]; // 分配10个默认初始化的string对象
使用new
表达式时,实际上执行了三步:第一步,new
表达式调用
operator new(operator new[])
标准库函数,分配一块足够大、原始的、未命名的内存空间以便存储特定类型的对象。第二步,编译器运行相应的构造函数以构造这些对象,并为其传入初始值。第三步,对象被分配了空间并构造完成,返回一个指向该对象的指针。
相应地,当使用delete([])
,实际执行了两步操作。第一步,对指针所指的对象执行相应的析构函数。第二步,编译器调用operator delete(operator delete[])
标准库函数释放内存空间。
这里对operator new
分配的内存空间我们使用placement new
来构造对象。
new(place_address) type
new(place_address) type (initializers)
new(place_address) type[size]
new(place_address) type[size] {braced initializer list}
以上过程涉及的c++
语法细节可以参阅c++ primer
。
为了精密分工,stl allocator决定将这两阶段操作区分开来。内存配置操作由allocator::allocate()
负责,内存释放操作由allocator::deallocate()
负责,对象构造操作由::construct()
负责,对象析构操作由::destory()
负责。
allocator.h
定义了配置器allocator
;
stl_construct.h
定义了全局函数construct()
和destory()
,负责对象的构造和析构;
stl_uninitialized.h
定义了全局函数,用来fill
或copy
大块内存数据,uninitialized_copy()
、uninitialized_fill()
和uninitialized_fill_n()
函数。