今天我们来讲讲C++的allocator类。
C++提供了new和delete操作符来管理动态内存空间。new操作通常需要完成两部分工作:一是在系统中申请内存空间,二是在分配的内存上构造对象。delete操作也通常需要完成对应的两部分工作:一个调用相应的析构函数销毁对象,二是回收内存。从这点看,new和delete操作符把内存空间的分配回收与对象的构建销毁紧紧关联在一起。对于new和delete的这种特性,如果我们只是申请单个对象的时候倒是很合适。因为我们几乎可以确定单个对象一定会被使用同时我们也希望将单个对象的内存和初始化组合在一起。
那如果我们需要分配一大块内存呢?这种情形就有点不同。考虑下面这段代码:
#include <iostream>
using namespace std;
class Example
{
public:
Example() { cout << "example default constructor..." << endl; }
Example(int x) : a(x) { cout << "example constructor..." << endl; }
~Example() { cout << "example destructor..." << endl; }
int a;
};
int main()
{
// 如果Example没有默认构造函数,则无法动态分配数组
Example *p = new Example[10];
delete[] p;
}
在上面这段代码中,我们new了一个长度为10的Example数组,这时new操作符不仅申请了相应大小的内存空间,还在分别执行了每个元素的默认构造函数。所以它的输出如下:</