当前位置: 代码迷 >> 综合 >> (六)内存分配器
  详细解决方案

(六)内存分配器

热度:40   发布时间:2023-10-17 01:38:02.0

内存分配器(allocator类)

C++的STL中定义了很多容器,容器的第二个模板参数通常为allocator类型。标准库中allocator类定义在头文件memory中,用于帮助将内存分配和对象的构造分离开来。它分配的内存是原始的、未构造的。

allocator<string> alloc;  定义了一个可以分配string的allocator对象
auto const p=alloc.allocate(n);  //分配n个未初始化的string内存,即为n个空string分配了内存,当然正如上面所说,分配的内存是原始的,未构造的。

 

allocator用法概述

allocator<T> a;   //定义了一个名为a的allocator对象,它可以为类型T的对象分配内存
a.allocator(n);   //分配一段原始的、未构造的内存,这段内存能保存n个类型为T的对象a.deallocate(p,n);  
//释放T*指针p地址开始的内存,这块内存保存了n个类型为T的对象,
//p必须是一个先前由allocate返回的指针,且n必须是p创建时所要求的大小,且在调用该函数之前必须销毁在这片内存上创建的对象。
//要求还蛮多的哈,这是因为在创建过程中我们分配的是最原始的内存,所以在释放内存时也是只能严格释放这片最原始的内存。a.construct(p,args); 
//p必须是一个类型为T* 的指针,指向一片原始内存,arg将被传递给类型为T的构造函数,用来在p指向的原始内存上构建对象。a.destory(p);  //p为T*类型的指针,用于对p指向的对象执行析构函数

使用步骤:

由于allocator将内存空间的分配和对象的构建分离,故使用allocator分为以下几步

//1.allocator与类绑定,因为allocator是一个泛型类//2.allocate()申请指定大小空间//3.construct()构建对象,其参数为可变参数,所以可以选择匹配的构造函数//4.使用,与其它指针使用无异//5.destroy()析构对象,此时空间还是可以使用//6.deallocate()回收空间

例子

#include <iostream>
using namespace std;
int main()
{int n = 1000; //老样子给个大数allocator<string> alloc; //拥有分配string内存能力的allocauto const p = alloc.allocate(n); //分配n个未初始化的stringauto q = p;//为string赋值alloc.construct(q++);           //*q为空alloc.construct(q++, 10, 'c');  //*q为ccccccccccalloc.construct(q++, "hi");     //*q为 hi//cout << *q-- << endl;        //q所指向的内存还未构造,会发生未知的行为while (q != p) {alloc.destroy(--q);        //要挨个摧毁元素}alloc.deallocate(p, n);       //摧毁内存空间return 0;
}
  相关解决方案