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

Posted joeylee97

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从零开始写STL-内存部分-内存分配器allocator相关的知识,希望对你有一定的参考价值。

内存分配器是什么?

一般而言,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的主要内容,如果未能解决你的问题,请参考以下文章

C alloca 函数 - 当试图分配太多内存时会发生啥

C:malloc/calloc/realloc/alloca内存分配函数

从零开始写STL-容器-双端队列

alloca() 如何在内存级别上工作?

alloca() 可以替代 C++ 中的自动指针吗?

STL容器自定义内存分配器