stl内存管理

来源:互联网 发布:淘宝为什么没有尺码 编辑:程序博客网 时间:2024/06/05 10:40

首先介绍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) typenew(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定义了全局函数,用来fillcopy大块内存数据,uninitialized_copy()uninitialized_fill()uninitialized_fill_n()函数。

0 0
原创粉丝点击