C++语言库提供两种一次分配一个对象数组的方法:
1.new表达式语法——分配内存和初始化一起
2.allocator类,分配和初始化分离。
int *pia = new int[42];
typedef int arrT[42];
int *p = new arrT;
//初始化动态分配对象的数组
int *pia = new int[10];
int *pia = new int[10]();
int *pia = new int[10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
new分配一个int数组,并返回指向第一个int的指针。虽然。通常new T[]分配的内存为“ 动态数组”,但当new分配一个数组时,返回的并不是一个数组类型的对象,而是一个指向数组元素类型的指针,即分配一个数组会得到一个元素类型的指针。
释放动态数组,例子如下,delete数组是需要加[],delete单一对象时不需要[],unique_ptr对于动态数组的释放使用delete。
delete p; //p必须指向一个动态分配的对象或为空
delete [] pia; //pia必须指向一个动态分配的数组或为空
unique_ptr<int []> up(new int[10]);
up.release(); //自动用delete[]销毁其指针
与unique_ptr不同,shared_ptr不直接支持管理动态数组,如果希望shared_ptr管理一个动态数组,必须提供自己定义的删除器。
//为了使用shared_ptr,必须提供一个删除器
shared_ptr<int> sp(new int[10], [] (int *p){delete[] p;} );
sp.reset();
allocator类
为了定义一个allocator对象,必须指明这个allocator可以分配的对象类型,当一个allocator对象分配内存时,它会根据给定的对象类型来确定恰当的内存大小和对齐位置:
allocator<string> alloc; //分配string类型的allocator对象
auto const p = alloc.allocate(10); //分配n个未初始化的string
auto q = p;
alloc.construct(q++); //*q为空指针
alloc.construct(q++, 10, 'c'); //*q为ccccccccc
alloc.construct(q++, "hi"); //*q为hi
while(q != p)
{
alloc.destroy(--q);
}
标准库allocator类及其算法
- allocator〈T〉 a:
- a.allocate(n)
- a.deallocate(p, n)
- a.construct(p, args)
- a.destory(p)
- unintialized_copy(b, e, b2)
- unintialized_copy_n(b, n,b2)
- unintialized_fill(b, e, t)
- unintialized_fill_n(b, n, t)