关于CString
来源:互联网 发布:淘宝大学诺思星 编辑:程序博客网 时间:2024/04/24 06:48
昨天重构代码的时候,这样一段代码:
返回的值让我大跌眼镜,返回的item中的pszText居然被清空了。
开始我猜测是不是item的赋值函数出了问题?最后发现居然问题是出在text.GetBuffer()里面。
CString里面实现的GetBuffer()代码如下:
也就是说当CString里面的pData被引用的次数超过1个的时候,CString就会为其重新分配空间。
再回过头来看原来的代码,当传入参数的时候,引用计数就会为2,到我调用text.GetBuffer()的时候,返回出来的m_pszData就是新分配并赋值过后的数据,再继续执行,item.pszText的赋值函数并没为其分配新的空间,而是指向的就是Cstring text刚刚新分配的地址。
当函数返回的时候,由于CString text是临时变量,会被析构,于是刚刚新分配的空间里面的数据就会被清空并且释放。
再仔细想想,CString为啥当引用计数为2的时候,会为其分配新的空间?
猜测如果没有分配新的空间,那么在一个对象对数据进行写操作的情况下,数据就会被锁定,而不能被另一个对象进行写,这样在多线程的情况下,效率就会降低,因为CString的赋值操作太频繁了,而要写这个数据的线程都会被堵在这里,等前一个线程操作结束后才能进行操作。
分配了新的空间,就能解决这个问题。
这只是个人的猜测,希望大家有另外不同的想法提出!
- 关于CString
- 关于CString
- 关于CString
- 关于CString
- 关于CString
- 关于CString
- 关于CString
- 关于CString总结
- 关于CString总结
- 关于Cstring 类
- 关于CString总结(zz)
- 关于CString总结
- 关于CString总结
- 关于CString总结
- 关于CString总结
- 关于CString总结
- 关于CString总结
- 关于CString总结
- deCarta与DDS的关系
- 初入工作,请各位前辈给予指点
- JAVA基础
- IBM WebSphere云平台首席架构师谈中间件和云计算
- daCarta
- 关于CString
- .NET中Eval()方法大全
- IBM部门介绍:研发部(R&D)【CDL、CRL、CSTL】
- 开始学习php
- 第一次写博客!
- TDateEditPicker: A Nullable & Bindingable Date Edit and Pick Control
- 游戏DX接管的研究
- win7安装SQL2005
- 管理软件开发历程之一Coolite配置