reallocate(C++类内使用allocator的问题)

2025-03-17 18:00:01 0

reallocate(C++类内使用allocator的问题)

本文目录

C++类内使用allocator的问题

allocator《T》 a a可以为类型为T的对象分配内存

a.allocate(n) 分配一段原始的未构造的内存,可以保存n个T类型的对象

a.deallocate(p,n) 释放T*指针p中地址开始的内存,保存了n个类型为T的对象;p必须是allocate返回的指针,n必须是p创建时所要求的大小,必须保证这些指针调用过destroy

a.construct(p, args) p必须是T*指针,指向原始内存,args传递给构造函数

a.destroy(p) p位T*指针,对p执行析构函数(销毁)

使用须知:

不要使用未构造的内存,小心越界,释放之前一定要销毁,只能销毁真正构造了得元素

p(内存未构造)----》p(可以使用)---------》p(使用结束)------------》p(释放内存)

a.allocate(p)          a.construct(p)              a.destroy(p)                     a.deallocate(p)

指针不能为空

例子:

动态内存管理类StrVec模仿std::vector《std::string》

使用allocator分配内存

指针成员

-----------未构造元素------------

 ^                              ^                                                  ^

  |elements                |first_free                                     |cap

elements         分配的内存的首元素

first_free          实际元素之后的位置(已构造元素的尾后元素,未构造元素的首元素)

cap                   分配内存末尾之后的位置

allocator《string》内存分配器

方法:

alloc_n_copy 分配内存,拷贝元素

free 销毁元素,释放内存

chk_n_alloc 检查空间,不够则分配新内存

reallocate 分配心内存

定义:

class StrVec{public:    StrVec(): //默认初始化        elements(nullptr), first_free(nullptr), cap(nullptr){}    StrVec(const StrVec &s)//拷贝构造函数    {        //分配内存,大小与s一样        auto newdata = alloc_n_copy(s.begin(), s.end());        elements = newdata.first;        first_free = cap = newdata.second;    }    StrVec &operator=(const StrVec &rhs)//拷贝赋值    {        //分配内存,大小与rhs一样        auto data = alloc_n_copy(rhs.begin(), rhs.end());        free();        elements = data.first;        first_free = cap = data.second;        return *this;    }    ~StrVec()//析构    {free();}        void push_back(const std::string&)//拷贝元素(别告诉我你没见过这个名字)    {        chk_n_alloc(); //检查空间        alloc.construct(first_free++, s); //构造s的副本(注意后置递增)    }    size_t size() const {return first_free - elements;}    size_t capacity() const {return cap - elements;} //这些都是vector的名字,一个效果    std::string *begin() const{return elements;}    std::string *end() const{return first_free;}//前面解释过了private:    Static std::allocator《std::string》 alloc;//分配元素    void chk_n_alloc()    {        if(size() == capacity()) //分配的内存用完            reallocate(); //重新分配    }    std::pair《std::string*, std::string*》 alloc_n_copy(const std::string*, const std::string*)    {        //分配空间        auto data = alloc.allocate(e - b);        return {data, uninitialized_copy(b, e, data)};    }    void free() //销毁元素释放内存    {        //不能传递给deallocate一个空指针,如果为零,函数不作为        if(elements)        {            //逆序销毁旧元素(析构)            for (auto p = first_free; p != elements;/*空下*/)                alloc.destory(--p);//这里先递减,递减后的指针销毁            //这里释放内存空间            alloc.deallocate(elements, cap - elements);        }    }    void reallocate()//重新分配内存    {        //分配两倍的空间        auto newcapacity = size() ? 2 * size() : 1;        //1的作用是因为0 * 2 = 0,使空元素分配一个空间                auto newdata = alloc.allocate(newcapacity);        //将数据从旧内存移动到新内存        auto dest = newdata;        auto elem = elements;        for(size_t i = 0;i != size(); ++i)            alloc.construct(dest++, std::move(*elem++));        free();        //更新数据结构        elements = newdata;        first_free = dest;        cap = elements + newcapacity;    }    std::string *elements;    std::string *first_free;    std::string *cap;//前面讲过};

关于realloc的用法

我也挺厚道的,给你一段能看懂的:realloc 原型:extern void *realloc(void *mem_address, unsigned int newsize); 功能:改变mem_address所指内存区域的大小为newsize长度。 说明:如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。 当内存不再使用时,应使用free()函数将内存块释放。 注意:这里原始内存中的数据还是保持不变的。 举例: // realloc.c #include 《syslib.h》 #include 《alloc.h》 main() { char *p; clrscr(); // clear screen p=(char *)malloc(100); if(p) printf(“Memory Allocated at: %x“,p); else printf(“Not Enough Memory!\n“); getchar(); p=(char *)realloc(p,256); if(p) printf(“Memory Reallocated at: %x“,p); else printf(“Not Enough Memory!\n“); free(p); getchar(); return 0; } 详细说明及注意要点: 1、如果有足够空间用于扩大mem_address指向的内存块,则分配额外内存,并返回mem_address 这里说的是“扩大”,我们知道,realloc是从堆上分配内存的,当扩大一块内存空间时, realloc()试图直接从堆上现存的数据后面的那些字节中获得附加的字节,如果能够满足,自然天下太平。也就是说,如果原先的内存大小后面还有足够的空闲空间用来分配,加上原来的空间大小= newsize。那么就ok。得到的是一块连续的内存。 2、如果原先的内存大小后面没有足够的空闲空间用来分配,那么从堆中另外找一块newsize大小的内存。 并把原来大小内存空间中的内容复制到newsize中。返回新的mem_address指针。(数据被移动了)。 老块被放回堆上。 例如: #include 《malloc.h》 char *p,*q; p = (char * ) malloc (10); q=p; p = (char * ) realloc (p,20); ………………………… 这段程序也许在编译器中没有办法通过,因为编译器可能会为我们消除一些隐患!在这里我们只是增加了一个记录原来内存地址的指针q,然后记录了原来的内存地址p,如果不幸的话,数据发生了移动,那么所记录的原来的内存地址q所指向的内存空间实际上已经放回到堆上了!这样一来,我们应该终于意识到问题的所在和可怕了吧! 3、返回情况 返回的是一个void类型的指针,调用成功。(这就再你需要的时候进行强制类型转换) 返回NULL,当需要扩展的大小(第二个参数)为0并且第一个参数不为NULL,此时原内存变成了“freed(游离)”的了。 返回NULL,当没有足够的空间可供扩展的时候,此时,原内存空间的大小维持不变。 4、特殊情况 如果mem_address为null,则realloc()和malloc()类似。分配一个newsize的内存块,返回一个指向该内存块的指针。 如果newsize大小为0,那么释放mem_address指向的内存,并返回null。 如果没有足够可用的内存用来完成重新分配(扩大原来的内存块或者分配新的内存块),则返回null.而原来的内存块保持不变。

reallocate(C++类内使用allocator的问题)

本文编辑:admin
: reallocate,

更多文章:


incorporated翻译(谷歌翻译manufacturing incorporated的中文)

incorporated翻译(谷歌翻译manufacturing incorporated的中文)

本文目录谷歌翻译manufacturing incorporated的中文公司的英语是什么求准确翻译!!!inc 和 co.ltd的区别翻译这个句子,谢谢Corporation、Inc.、Co.Ltd、Company什么区别谷歌翻译manu

2025年2月28日 09:40

图书管理系统开题报告(图书管理系统 开题报告 急需)

图书管理系统开题报告(图书管理系统 开题报告 急需)

本文目录图书管理系统 开题报告 急需图书管理系统的设计与实现开题报告怎么写现在我们学校刚刚开题报告,题目是图书管理,谁给我这方面的资料图书管理系统跪求图书租赁管理系统开题报告在线图书销售管理系统开题报告jsp+sql基于JAVA的图书管理系

2025年2月14日 10:00

从技术层面看,公有云、私有云、混合云是分别什么意思?微软云计算提供了几种服务模式

从技术层面看,公有云、私有云、混合云是分别什么意思?微软云计算提供了几种服务模式

本文目录从技术层面看,公有云、私有云、混合云是分别什么意思微软云计算提供了几种服务模式如何利用Server 2012打造企业私有云什么叫公有云、私有云、混合云从技术层面看,公有云、私有云、混合云是分别什么意思1 私有云私有云是为某个特定用户

2025年3月3日 03:10

transitions翻译(高人帮忙翻译一下 谢谢啦!)

transitions翻译(高人帮忙翻译一下 谢谢啦!)

本文目录高人帮忙翻译一下 谢谢啦!英文如何翻译下面一段六级英语句子求翻译!transition是什么意思专业英语翻译求助!求高手英语翻译高人帮忙翻译一下 谢谢啦!Petri网一分为地变、定向弧线. 经营场所和弧之间跃迁未与地方之间、地方或变

2025年3月6日 02:20

cad是什么专业学的(什么专业可以学习做CAD软件)

cad是什么专业学的(什么专业可以学习做CAD软件)

本文目录什么专业可以学习做CAD软件CAD属于什么专业我是高三学生报什么专业学CAD制图大学什么专业学c语言和cadCAD是哪个专业里的科目要学这个应该选择什么专业CAD软件属于哪个专业CAD是什么专业什么专业可以学习做CAD软件基本的理工

2025年3月21日 01:20

compulsory翻译(把这句英语翻译成汉语【At. least. 38. should. be. compulsory)

compulsory翻译(把这句英语翻译成汉语【At. least. 38. should. be. compulsory)

本文目录把这句英语翻译成汉语【At. least. 38. should. be. compulsory义务教育的英文,义务教育的翻译,怎么用英语翻译义务英语中的虚拟语气compulsory course是什么意思翻译两个单词compuls

2025年2月19日 13:00

精神分裂症的诊断标准(精神分裂具体是什么)

精神分裂症的诊断标准(精神分裂具体是什么)

本文目录精神分裂具体是什么精神分裂症的诊断标准是什么精神分裂专家请进来精神分裂具体是什么精神分裂症是一组病因未明的精神病,具有感知、思维、情感、行为等多方面的障碍和精神活动的不协调以及精神活动与环境不协调为特征的一种最常见的精神病。多起病于

2025年3月31日 18:20

php正则匹配中文(PHP正则提取中文部分内容,怎么实现呀)

php正则匹配中文(PHP正则提取中文部分内容,怎么实现呀)

本文目录PHP正则提取中文部分内容,怎么实现呀PHP正则表达式验证是否含有中文PHP正则表达式中怎么匹配汉字啊 - 技术问答PHP正则提取中文部分内容,怎么实现呀中文可以用正则表达式进行匹配,但是具体匹配方法与中文的编码方式有关:如果是GB

2025年3月14日 06:50

bandizip有广告吗(Bandizip和WinRAR哪个好用)

bandizip有广告吗(Bandizip和WinRAR哪个好用)

本文目录Bandizip和WinRAR哪个好用pc压缩软件bandizip安装助手需要花钱吗Bandizip和WinRAR哪个好用肯定是Bandizip好用。它干净无广告,解压速度快,支持文件类型多,关键还免费,肯定是首选。Winrar涉及

2025年3月31日 03:10

alternatives翻译(替代品的英文翻译)

alternatives翻译(替代品的英文翻译)

本文目录替代品的英文翻译Alternative 翻译 做句三选其一的英文翻译!!一个词 不是alternative 是啥替代品的英文翻译替代品的英文:substitute词汇解析:substitute英文发音:中文释义:n.代替者;代替物;

2025年3月21日 06:40

傅里叶变换公式大全(傅里叶变换常用公式是什么)

傅里叶变换公式大全(傅里叶变换常用公式是什么)

本文目录傅里叶变换常用公式是什么sinwt的傅里叶变换公式是什么傅里叶变换公式是什么常见函数傅里叶变换基本公式是什么傅里叶变换的公式傅里叶变换公式如何理解傅里叶变换公式傅里叶变换常用公式是什么  公式如下图:  傅里叶变换,表示能将满足一定

2025年2月17日 01:00

长沙人才市场招聘信息(长沙人才市场在哪)

长沙人才市场招聘信息(长沙人才市场在哪)

本文目录长沙人才市场在哪长沙的人才市场有几个都在哪长沙人才市场在哪大型的人才市场基本上就是这些了当然,长沙五区都有自己的人才市场的!一般大型招聘会的会在贺龙体育馆那边和展览馆的!一、长沙人才市场地址:长沙市劳动西路299号贺龙体育场南门一楼

2025年2月18日 11:40

buddy什么意思中文(buddy有好姐妹的意思吗)

buddy什么意思中文(buddy有好姐妹的意思吗)

本文目录buddy有好姐妹的意思吗buddy和friend的区别是什么美俚语中buddy和dude有什么区别buddy有好姐妹的意思吗答: buddy做名词多表示朋友、同伴、老兄和搭档的意思,作动词表示交往、结交和交朋友。作名词表示老兄的意

2025年3月29日 19:40

deepin(deepin操作系统好用吗)

deepin(deepin操作系统好用吗)

本文目录deepin操作系统好用吗手机系统就算了,中国开发不出macOS那样的PC操作系统吗deepin差太远了deepin操作系统好用吗还可以,deepin是基于debian的,在桌面环境下下了很多功夫,常用的多媒体软件深度都有包含,不至

2025年2月18日 00:50

teenagers怎么读(teenager怎么读)

teenagers怎么读(teenager怎么读)

本文目录teenager怎么读teenagers’ 复数的所有格 读音是怎样的父母的英语单词怎么读句中的“Teenagers”什么意思,怎么读teenager怎么读teenager: n. 13岁到19岁的年轻人例句与用法: 1. It

2025年4月2日 21:40

javascriptjavascript教师(前端学习中 先学好javascript还是先学jquery框架)

javascriptjavascript教师(前端学习中 先学好javascript还是先学jquery框架)

本文目录前端学习中 先学好javascript还是先学jquery框架这是JavaScript的一段代码,帮我分析一下用到了什么,具体点,回答老师用的为什么江苏教师教育打开就是出现该网站的javascript+txt文件存在限制指令呢jav

2025年3月8日 06:40

数据库查询成绩排名前三(数据库考试查询微观经济学成绩前三名的学生信息,那个前三名怎么设置,急求)

数据库查询成绩排名前三(数据库考试查询微观经济学成绩前三名的学生信息,那个前三名怎么设置,急求)

本文目录数据库考试查询微观经济学成绩前三名的学生信息,那个前三名怎么设置,急求SQL语句如何查询成绩的前三名带成绩重复的请教一个问题,SQL怎么查询出排名第三的人数据库查询总成绩最高的三名学生的学号SQL语句:查询各班成绩前3的同学姓名如何

2025年4月3日 05:30

转行软件测试后悔了(30岁转行做软件测试会不会太大了)

转行软件测试后悔了(30岁转行做软件测试会不会太大了)

本文目录30岁转行做软件测试会不会太大了转行软件测试你后悔了吗今年转行学习软件测试还有发展前景吗30岁 想转行软件测试行业,还能转吗不相关专业想转行软件测试,不知道前景怎么样IT行业的高薪还能维持多久你曾后悔进入 IT 行业吗为什么学计算机

2025年2月12日 12:20

模板网站源码(网站模板和源码的区别是什么)

模板网站源码(网站模板和源码的区别是什么)

本文目录网站模板和源码的区别是什么网站源码和网站模板有什么区别网站源码和网站模板是一样么网站模板和源码的区别是什么模板就是别人做好的.你下载下来.就可以使用.也可以在模板上再加一代码.源码和代码意思是一样的.代码则是一段(没有学过的人)看不

2025年2月28日 10:30

腾讯云域名购买(腾讯云购买的域名,可以用于其他主机吗怎么做)

腾讯云域名购买(腾讯云购买的域名,可以用于其他主机吗怎么做)

本文目录腾讯云购买的域名,可以用于其他主机吗怎么做腾讯云弄的域名是个什么东西腾讯云购买的域名,可以用于其他主机吗怎么做可以用在其它主机上,具体使用步骤和一般域名的使用没啥区别,如果你是第一次使用域名,建议主机和域名采用同一家的,沟通操作起来

2025年2月9日 19:20

近期文章

本站热文

harbor,port,pier的区别?谁能解释“harbour“(港口)与“pier“(码头)的区别
2025-02-22 17:40:03 浏览:16
ibatis foreach(ibatis 批量update操作)
2025-02-10 23:40:06 浏览:7
endless rain(endless rain表达什么情感)
2025-02-14 06:00:02 浏览:6
标签列表

热门搜索