内容: 记录下看到关联容器和非关联容器的clear()的差别后,我对string的clear()还没怎么使用过,于是我就测试了一番,果然也不是真的删除!下面我来一一剖析吧。

测试一:string的内容放在哪里?
在这里插入图片描述
在这里插入图片描述
结果:其实string的内容是放在内部的一个指针中的,可以通过Myptr函数来得到。或者直接引用他的ptr数据成员。

测试二:调用clear()的结果是什么?
在这里插入图片描述
在这里插入图片描述
结果:删除所有元素(不是真删除!!)

测试三:对删除后的对象以及对象的数据指针的测试
在这里插入图片描述
在这里插入图片描述
分析:这时候我们仿佛觉得事实是真的删除了数据成员的内容,然而并不是。下面,我们来看看clear()函数吧。

测试四:查看clear()函数
在这里插入图片描述
此时,我们再跟进去_Eos(0)这个函数:在这里插入图片描述
我们发现其实是修改大小,然后追加了什么。我们接着剖析。

测试五:如果删除不是真删除,那么p+1会是什么内容呢?
在这里插入图片描述
在这里插入图片描述
分析:此时我们是不是已经大概猜出来,clear()函数做了什么事吧。既然没有真的删除这个空间,然而对空间首地址确无法打印完整字符串,莫非是将首地址的内容设置为:’\0’ 吗?真相马上揭晓了。

测试六:clear()的真面目
在这里插入图片描述
在这里插入图片描述

分析:是的,clear()并不是删除那篇空间,而是将空间的首字符设置为’\0’

感受:有时候,无聊的时候,随便拿个容器,拿个函数测测,都会发现其实现一般情况下都跟我们想象的不一样哈哈。真的是:实践出真知啊。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐