C++ STL string?为什么样swap后array和string的迭代器会失效

发表时间:2018-01-02 07:20:01 作者: 来源: 浏览:

在上一篇文章中,小编为您详细介绍了关于《买中标燃气壁挂炉需不需要补差价?为什么样开机出现要按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的迭代器会失效》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《科幻电影中那样怪兽喷出强酸腐蚀其他物质却不会腐蚀自己的情况可能发生么?手机话筒出现故障其他功能均正常》,感兴趣的同学可以点击进去看看。

资源转载网络,如有侵权联系删除。

相关资讯推荐

相关应用推荐

玩家点评

条评论

热门下载

  • 手机网游
  • 手机软件

热点资讯

  • 最新话题