allocator 类
\(allocator类定义在头文件memory中,帮我们将内存分配和对象构造分离开来.\)
\(它分配的内存时未构造.\)
aallocator<string> alloc; // 定义可分配string的allocator对象
auto const p = alloc.allocate(n); // 分配n个string
allocator 操作:
allocator<T> a // 定义可分配T类型的对象
a.allocate(n) // 分配未构造的n个类型T
a.deallocate(p, n) // 释放从T*指针中地址开始的内存,这块内存保存了n个类型T的对象
// p必须是先前由allocate返回的指针, n必须p创建时要求的大小
// 调用之前,用户应对这片内存调用destory
a.construct(p, arg) // p是类型为T*的指针, 指向一块原始内存
// arg被传递给T的构造函数,用来在p中内存创建一个对象
a.destory(p) // p为T*类型的指针,此算法对p指向的对象执行析构函数
allocate 分配未构造的内存
\(construct成员函数接受一个指针和零个或多个额外参数,在给定位置构造一个元素,额外用来初始化对象.\)
auto q = p;
alloc.construct(q++); // *q为空字符串
alloc.construct(q++, 5, 'c') // *q为ccccc
alloc.construct(q++, "hi") // *q为hi
\(还未构造对象的情况下就使用原始内存是错误的.\\为了使用allocate返回的内存,必须用construct构造对象,使用未构造内存,行为是未定义的.\)
\(用完对象后,用destroy函数销毁,它接受指针,调用对象的析构.\)
while(q != p)
alloc.destroy(--q) // 释放构造的string
\(一旦元素被销毁,可以重新使用这片内存,也可以将其归还给系统,调用deallocate函数.\)
alloc.deallocate(p, n);
\(p不能未空,且大小必须与分配内存提供的大小参数一样.\)
两个伴随算法
uninitialized_copy(b, e, b2) // 从迭代器b和e范围下将元素拷贝到迭代器b2
// b2指向的内存必须足够大
uninitialized_copy_n(b, n, b2) // 从迭代器b指向的元素开始,拷贝n个元素到b2开始的内存
uninitialized_fill(b, e, t) // 从迭代器b和e范围内的原始内存创建对象,对象的值均为t的拷贝
uninitialized_fill_n(b, n, t) // 从迭代器b指向的内存地址开始创建对象n个对象. b必须足够大
auto p = allocc.allocate(vi.size() * 2);
auto q = uninitialized_copy(vi.begin(), vi.end(), p);
uninitialized_fill_n(q, vi.siize(), 42);
\(uninitialized\_copy返回一个指针,指向最后一个构造的元素之后的位置.\)