ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

allocator()类

2022-08-18 20:32:04  阅读:128  来源: 互联网

标签:alloc string 对象 内存 new allocator


allocator类

群友之前问了一个问题,C++除了new和malloc还有什么分配内存的方法,当时我在想mmap()、brk()这些系统调用,后来突然想到STL里面有一个allocator类似乎也是做空间分配的。现在来学一学。

new/delete的局限性

抽象的描述new的行为:将内存分配对象构造组合在一起。也就是operator new分配内存,构造函数构造对象。

但有的时候,我们需要将这两个行为分离。比如说,我们先分配一大片内存,然后再内存上构造对象,如果不分离这两个操作,那么我们就会在内存上提前创建大量的对象,但实际上我们不一定需要使用这么多对象。我们期望在我们真正需要时才创建对象。

就像下面这个例子:

string *const p = new string[n];//n个空string
string s;
string *q = p;
while(cin>>s && q != p+n) *q++ = s; //不断输入
const size_t size = q-p;
delete[] p;//销毁

allocator 类

使用时引入#include<memory> 库。

allocator<string> alloc;
auto const p = alloc.allocate(n);

这样我们就可以先分配内存,再逐个创建内存了。

allocator类有这些函数:

//定义一个名为alloc的allocator对象
allocator<T> alloc; 
//分配一段内存,保存n个类型为T的对象,这一段内存是没有构造,返回一个指针指向内存首地址,类型为T*
alloc.allocate(n);
//释放T*指针p开始的地址。这一段内存有n个类型为T的对象
alloc.deallocate(p,n);
//在p指针指向的内存构造一个对象,args是构造函数的参数列表
alloc.construct(p,args);
//析构p指针指向内存的对象,注意在调用deallocate()之前需要调用destory()逐一析构
alloc.destory(p);

标签:alloc,string,对象,内存,new,allocator
来源: https://www.cnblogs.com/Paranoid5/p/16599992.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有