【博客55】C++ string的clear()函数的真面目!

本文深入探讨了C++中string类的clear()函数,并通过实验揭示了它并非真正删除内存中的数据,而是将首字符设置为'',使字符串长度变为0。通过这一过程,读者可以了解到string内部实现的细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

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

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

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

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

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

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值