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

时间:2018-01-02 07:20:01   浏览:次   点击:次   作者:   来源:   立即下载

原理上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来说它就失效了。

收起

相关推荐

相关应用

平均评分 0人
  • 5星
  • 4星
  • 3星
  • 2星
  • 1星
用户评分:
发表评论

评论

  • 暂无评论信息