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返回一个指针,指向最后一个构造的元素之后的位置.\)

posted @ 2021-03-24 18:31  phr2000  阅读(50)  评论(0编辑  收藏  举报