12.2 Dynamic Arrays
很重要的要记住动态数组没有数组类型
初始化数组列表时,当array.size() < allocate array size 时,剩余部分被初始化为null;反之,fail
当我们使用new去分配一个大小为0的数组时,new返回一个有效的,非零的指针
在数组中的元素被倒序摧毁
当我们使用unique_ptr指向一个数组时,我们不能使用 . 或者 -> 访问操作符
对于shared_ptr来说没有下表访问操作符,智能指针不支持指针算术
| 操作 | 说明 |
| unique_ptr<T[]> u | u能够指向一个动态分配类型为T的数组 |
| unique_ptr<T[]> u(p) | u指向内置指针p所指向的动态分配的数组 |
| u[i] | 返回u拥有数组中位置i处的对象;u必须指向一个数组 |
更重要的是,类如果没有默认构造方法,不能使用动态分配一个数组
| 操作 | 说明 |
| allocator<T> a | |
| a,aloocate(n) | 分配原始的,未构造的内存储存n个类型为T的对象 |
| a.deallocate(p, n) |
释放n个类型为T,以p为起始地址的内存 |
| a.construct(p, arg) | |
| a.destroy(p) | 运行析构函数释放p指向地址的内存。 |
使用allocator分配的内存是未构造的。
#include <iostream> #include <string> #include <memory> using namespace std; int main() { allocator<string> alloc; auto p = alloc.allocate(10);//分配十个单位的空间, p指向起地址 auto q = p;//指针q作为位置移动 alloc.construct(q++, "hello");//第一个位置"hello" alloc.construct(q++, "world!");//第二个位置"world!" cout << *p << endl;//输出第一个单位内存的数据 //cout <<< *q << endl;q指向未构造内存 system("PAUSE"); return 0; }
while(q != p) alloc.destroy(--q); //一个一个清楚p指向内存中的数据,将之变为""
alloc.deallocatr(p, n) //释放内存,n的大小必须和在allocate使用大小相同

浙公网安备 33010602011771号