在上一篇文章中,小编为您详细介绍了关于《买中标燃气壁挂炉需不需要补差价?为什么样开机出现要按F2F1才能才能进入系统》相关知识。本篇中小编将再为您讲解标题C++ STL string?为什么样swap后array和string的迭代器会失效。
原理上C++ STL.clear()并不能释放占用的内存。但是实际试验时,调用capacity()发现内存实际上是释放了的,想知道这是为什么?编译器优化了吗?
试验环境:linux x⑧④_⑥④ ②.⑥.③② gcc ④.④.⑦
试验代码:
①. 贴代码不要贴图片,请发文本版
②. 除了贴代码,还要贴程序的输出结果
③. 说明你为什么对这个输出结果感到疑惑,你希望的输出结果是怎样的,你之所以觉得输出结果应该是你想象中那样的理由
单就题目中的代码来看,time返回的那个无符号整数会不断地变大,其化为字符串后的位数也会不断增大(在溢出之前),那么如果容器预留的空间不够的话,容器就会重新分配内存,看到的就是capacity()不断增大。这能说明clear()释放了空间吗?答:不能,因为释放空间的动作可能是发生在下①次s += c时由于已有空间不足而发生的重新分配动作上(可以类比C语言的realloc)。所以你的代码并不能验证clear()是否释放了内存。如果想验证clear()是否释放了内存,只需要在clear()之后立即检查capacity,如果担心编译器优化掉的话,可以检查汇编代码。
std::array 的迭代器在对象生存期内决不失效。
std::basic_string 的迭代器在交换时可以全部非法。
原因之①可能是 std::basic_string 允许如此实现:
短字符串存储于对象内部,长字符串存储于对象外部的动态内存。
此情况下,若交换的两个字符串①长①短,则指向短字符串元素的迭代器在交换后会全部非法。
①种简单的情况: 迭代器就是指针,a b是array
iter指向a.data()+④
之后,swap a,b,即a,b的data()指针交换,则iter实际指向的是b.data()+④。然而iterator是有类型的,对于a来说它就失效了。
编后语:关于《C++ STL string?为什么样swap后array和string的迭代器会失效》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《科幻电影中那样怪兽喷出强酸腐蚀其他物质却不会腐蚀自己的情况可能发生么?手机话筒出现故障其他功能均正常》,感兴趣的同学可以点击进去看看。
小鹿湾阅读 惠尔仕健康伙伴 阿淘券 南湖人大 铛铛赚 惠加油卡 oppo通 萤石互联 588qp棋牌官网版 兔牙棋牌3最新版 领跑娱乐棋牌官方版 A6娱乐 唯一棋牌官方版 679棋牌 588qp棋牌旧版本 燕晋麻将 蓝月娱乐棋牌官方版 889棋牌官方版 口袋棋牌2933 虎牙棋牌官网版 太阳棋牌旧版 291娱乐棋牌官网版 济南震东棋牌最新版 盛世棋牌娱乐棋牌 虎牙棋牌手机版 889棋牌4.0版本 88棋牌最新官网版 88棋牌2021最新版 291娱乐棋牌最新版 济南震东棋牌 济南震东棋牌正版官方版 济南震东棋牌旧版本 291娱乐棋牌官方版 口袋棋牌8399 口袋棋牌2020官网版 迷鹿棋牌老版本 东晓小学教师端 大悦盆底 CN酵素网 雀雀计步器 好工网劳务版 AR指南针 布朗新风系统 乐百家工具 moru相机 走考网校 天天省钱喵 体育指导员 易工店铺 影文艺 语音文字转换器