昨天重构代码的时候,这样一段代码:
返回的值让我大跌眼镜,返回的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的赋值操作太频繁了,而要写这个数据的线程都会被堵在这里,等前一个线程操作结束后才能进行操作。
分配了新的空间,就能解决这个问题。
这只是个人的猜测,希望大家有另外不同的想法提出!