内存分配器是什么?
一般而言,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();//泛型析构
}