码迷,mamicode.com
首页 > 其他好文 > 详细

STL源码剖析 第二章 空间配置器

时间:2020-11-07 17:27:54      阅读:21      评论:0      收藏:0      [点我收藏+]

标签:代码   trait   需要   code   const   color   c++   style   cli   

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源码剖析 第二章 空间配置器

标签:代码   trait   需要   code   const   color   c++   style   cli   

原文地址:https://www.cnblogs.com/zouma/p/13940413.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!