CString的几个使用点滴

 以前一直觉得CString已经用的很熟练,不过前几天又因为错误的使用CString,引发了一个非常难发现的bug,所以决定把CSting使用的一点心得分享一下。

1、看MSDN上CString的详细介绍才是王道,虽然是英文的,但是一定要硬着头皮看完,吃透。


 

2、直接查看CString的实现源码,我相信看完了并且理解之后,你绝对会有恍然大悟的感觉。


 

3、CString内部实现时,为了节省内存,使用的 引用 看来管理字符串,并且每个CString只有一个指针成员变量,指向相应的字符串,当你将同一个字符串赋值给不同的CString变量时,并没有重新分配内存,而且增加了这个字符串的引用计数,只有当一个CString发生改变时,才重新分配,我说的有点抽象。具体实现时候,CString内部的指针和真正存储字符串的堆之间还有个一个引用内存块存在,CString内部的指针内部的指针实际上是指向这个引用内存快的,然后引用内存块内部记录了字符串的真正地址和字符串的长度。


 

4、和标准C字符串之间的转换,使用LPCTSTR来强制转换,通过操作符重载来实现;使用GetBuffer来转换,返回的是LPTSTR,这里就有问题了,使用LPCTSTR来强制转换返回的是常量指针,如果在代码中去掉常量属性并且进行赋值的话,程序就非常危险了,前面说过,CString使用引用来管理字符串,你强制改变很有可能附带使其他的CString也被修改了,这种情况下只能使用GetBuffer来获取字符串,GetBuffer的内部实现重新申请了新的内存块,但是你使用GetBuffer之后应该及时调用ReleaseBuffer来更新引用内存块,否则的话,再调用CString的其他的成员函数很有可能返回错误的结果。另外就是GetBuffer的参数问题,其实如果你确定不会加长字符串,简单传0就可以了,如果要加长,就传一个具体的整数。


 

5、关于LockBuffer和UnLockBuffer,本质是通过控制一个变量来决定是否启用引用功能。如果一个CString被LockBuffer的话,再次赋值时它指向的字符串是不会被再次引用的,而是直接分配新的内存块。


 

6、跨模块使用CString,也就是将CString当参数使用,建议不要这么使用,CString中定义了全局静态变量,在不同的模块中使用静态变量的地址可能不同,最终造成CString异常,dll的接口应该设计成标准C字符串指针,不管是从消耗上还是从可移植性上来讲,都应该这么设计。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值