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

从零开始写STL-内存部分-内存分配器allocator

时间:2018-03-27 14:45:19      阅读:374      评论:0      收藏:0      [点我收藏+]

标签:template   gravity   避免   new   div   log   构造   tps   ...   

内存分配器是什么?

一般而言,c++的内存分配和释放是这样操作的
>>class Foo{ //...};
>>Foo* pf = new Foo;//配置内存,然后建构对象
>>delete pf; //将对象解构,然后释放内存
  其中的 new操作内含两阶段动作:(1)调用::operator new配置内存,(2) 调用Foo::Foo()建构对象内容。delete操作也内含两阶段动作: (1)调用Foo::~Foo()将对象解构,(2)调用::operator delete释放内存。
  为了精密分工,STL allocator决定将这两阶段区分开来。内存配置由alloc:allocate()负责,内存释放由alloc::deallocate()负责; 对象建构由::construct()负责,对象析构由::destroy()负责。

题外话 对于new 和 delete

为了避免对后面析构函数 和 内存回收的部分产生一些基本疑问,对new 和 delete做一些总结

  • new 的调用过程
    技术分享图片
  • operator new 源码解析
    技术分享图片
  • delete 的调用过程
    技术分享图片

construct 与 destory

//在分配好的内存上调用T1类的构造参数
//T2 应该是能被T1类型的构造参数接收的类型或者可以隐式转换为可接受类型的值
template<class T1, class T2>
inline void construct(T1* p, const T2& value)
{
    new(p) T1(value);//调用placement new 
    // 在已经分配好的内存上调用构造函数,不能用delete释放
}

template<class T>
inline void destroy(T* ptr)
{
    ptr->~T();//泛型析构
}

从零开始写STL-内存部分-内存分配器allocator

标签:template   gravity   避免   new   div   log   构造   tps   ...   

原文地址:https://www.cnblogs.com/joeylee97/p/8656510.html

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