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来说它就失效了。
- 5星
- 4星
- 3星
- 2星
- 1星
- 暂无评论信息