为数组new动态内存
int *p=new int[42]
或者
typedef int arrT[42];
int *p=new arrT;
注意:
- 动态数组不是数组类型,并能调用begin或end,也不能用for;只能使用数组维度来返回指向首位的指针。与常规数组的区别在于,初始化的时候不可以在圆括号里用初始化器,(auto根据初始化器判断类型)所以不能用auto分配动态数组。
- 创建一个大小为0的动态数组是合法的,但不可以对其指针解引用(不指向任何元素)
释放动态指针:delete [] pa;
,最后一个元素首先被销毁
智能指针和动态数组
1.用unique_ptr管理动态数组
unique_ptr<int[]> up(new int[10]);
up.release();
2.用shared_ptr管理指针,要定义删除器;当访问元素时,用sp.get()可以获得sp中保存的指针
shared_ptr<int> sp(new int[10],[](int *p){delete[] p;});
sp.seset();
allocator模板类
要解决的问题:在创建对象之前预先分配大块的存储空间肯能会导致存储空间的浪费(数组中元素的个数n<MACSIZE)
当allocator对象分配内存时,会根据给定的对象类型来确定恰当的内存大小和对齐位置
# include <memory>
allocator<striing> alloc;
auto const p=alloc.allocator(n);
auto q=p;//q指向最后构造元素之后的位置(未构造内存)
alloc.construct(q++,10,'x');//对于未构造内存,只能使用construct构造元素(不能用元素类型的构造函数,只能拷贝)
while(q!=p)
alloc.destroy(--q);//用完对象后要销毁
alloc.dealocate(p,n);//释放内存
a.deallocate(p,n) | 释放从指针p中地址开始的内存 |
---|---|
a.construct(p,args) | 在p指向的内存中构建一个对象 |
a.destory( p ) | 对p指向的对象执行析构函数 |
a.construct(p,args) | 在p指向的内存中构建一个对象 |
拷贝填充未初始化内存:
auto p=alloc.allocate(vi.size()*2);
auto q=uninitialized_copy(vi.begin(),vi.end(),p);
uninitialized_fill_n(q,vi.size(),42);