关于CString

来源:互联网 发布:淘宝大学诺思星 编辑:程序博客网 时间:2022/07/04 23:53

昨天重构代码的时候,这样一段代码:

 

 

 

返回的值让我大跌眼镜,返回的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的赋值操作太频繁了,而要写这个数据的线程都会被堵在这里,等前一个线程操作结束后才能进行操作。

分配了新的空间,就能解决这个问题。

 

这只是个人的猜测,希望大家有另外不同的想法提出!

 

 

原创粉丝点击