内容: 记录下看到关联容器和非关联容器的clear()的差别后,我对string的clear()还没怎么使用过,于是我就测试了一番,果然也不是真的删除!下面我来一一剖析吧。
测试一:string的内容放在哪里?
结果:其实string的内容是放在内部的一个指针中的,可以通过Myptr函数来得到。或者直接引用他的ptr数据成员。
测试二:调用clear()的结果是什么?
结果:删除所有元素(不是真删除!!)
测试三:对删除后的对象以及对象的数据指针的测试
分析:这时候我们仿佛觉得事实是真的删除了数据成员的内容,然而并不是。下面,我们来看看clear()函数吧。
测试四:查看clear()函数
此时,我们再跟进去_Eos(0)这个函数:
我们发现其实是修改大小,然后追加了什么。我们接着剖析。
测试五:如果删除不是真删除,那么p+1会是什么内容呢?
分析:此时我们是不是已经大概猜出来,clear()函数做了什么事吧。既然没有真的删除这个空间,然而对空间首地址确无法打印完整字符串,莫非是将首地址的内容设置为:’\0’ 吗?真相马上揭晓了。
测试六:clear()的真面目
分析:是的,clear()并不是删除那篇空间,而是将空间的首字符设置为’\0’
感受:有时候,无聊的时候,随便拿个容器,拿个函数测测,都会发现其实现一般情况下都跟我们想象的不一样哈哈。真的是:实践出真知啊。