STL源码剖析 第二章 空间配置器
Posted zouma
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STL源码剖析 第二章 空间配置器相关的知识,希望对你有一定的参考价值。
C++内存配置操作和释放操作如下:
1 class Foo{...}; 2 Foo* pf=new Foo; //配置内存,然后构造对象 3 delete pf; //将对象析构,然后释放内存
内存配置操作由 alloc:allocate() 负责,内存释放操作由 alloc:deallocate() 负责;对象构造操作由 ::construct() 负责,对象析构操作由 ::destroy() 负责。
destroy() 有两个版本,第一个版本接受一个指针,析构指针所指的对象。
第二个版本接受 first 和 last 两个迭代器,将 [first,last) 范围内所有对象析构。在这里我们就要考虑这些对象是否值得我们一次次的调用实际没有作用的析构函数,所以我们就利用 value_type() 求出迭代器指向对象的类型,并调用相应的 __type_traits<> 判断对象的析构函数是否是trivial的。
内存配置和释放操作复杂很多。分别第一级配置器和第二级配置器。第一级配置器的 allocate() 和 realloc() 都是在调用 malloc() 和 realloc() 不成功后,改调用 oom_malloc() 和 oom_realloc() 。后两者都有内循环,不断调用需要客端设计的“内存不足处理例程”,如果没有设计,就丢出 bad_alloc 异常信息。
union obj{ union obj* free_list_link; char client_data[1]; };
这个地方 client_data 的地址等于 obj 的地址,那么为什么我们要加上这个可有可无的代码呢?可能是用 obj->client_data 可以避免 (char*) 的强制转换吧。
以上是关于STL源码剖析 第二章 空间配置器的主要内容,如果未能解决你的问题,请参考以下文章