STL string的内存释放

很久都没有发原创博客了,今天来谈谈自己对stl中的string类的理解。

说实话,我其实是比较崇尚用微软的那套技术,C#那些玩意,用起来感觉倍儿爽,但工作的时候发现搞C#貌似不挣钱呀。百度、腾讯这种互联网公司都是用c++进行开发。

虽然一直不是很喜欢用c++,但是经过实习和工作这段时间的锻炼,可能c++已经成为了我最熟练的语言了。说到c++,用到最大的东东,那就是stl了。神马string、vector、set、map呀的,是用的最多的了。

废话少说了,string类相比char*来说,要好用得多。自己不必要去管string的内存分配的问题,字符串的长度问题也不要过多的操心。

随着用string越来越多,有的时候你会发现string的内存管理的问题,存在内存暂时泄露的问题。这个内存泄露与我们常规说的内存泄露问题不一样。它部是真的内存泄露,在程序结束的时候,内存还是会释放掉的,但是在程序的运行过程中,内存被string对象占用着。比如你有个string对象保存了一个比较大的网页,用完了之后,你想通过clear来回收这个对象的内存,你这样是做不到的。因为string的clear并不会真正回收string对象分配内存。那要怎么做才能做到呢?

用swap函数,你申请一个临时的string对象,然后用这个临时string对象与要释放内存的string对象交换内存,就能达到释放内存的作用。比如s是我们要释放的内存,那么string().swap(s);就能释放掉s对象的内存。

有的时候,你想直接操作stirng对象的数据存储空间,那怎么办呢?我们知道可用data()函数获取stirng对象的数据存储空间的指针,虽然该指针是const,但这难不倒我们,因为我们可以const_cast。对这方面的问题,网上基本没有什么资料,经过我的摸索,正确直接操作string data buffer的方法是:

  1. 先调用resize函数,将data buffer开到一定的大小,具体多大由需求多定。注意这里不应该用reserve函数来搞,因为reserve函数只是分配对应的空间,并没有改变stirng的length。
  2. 调用data()函数,并const_cast成char *。
  3. 对转换后得到的char *进行操作,注意不能超过第一步resize的大小,否则可能有越界的危险。
  4. 调用resize函数将string的长度调整为实际的长度。实际的长度应该由上一步实际的操作来决定。

假设我们第一步用的是reserve函数,会有什么问题呢?首先可以明确的是,不会有越界的危险。但是,如果你这么做的话,往往不会得到正确的结果。为什么呢?因为第4步进行resize的时候,你之前对char*的操作,可能被重置为null char。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值