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

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

 

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

 

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 四岁宝宝说话有点口吃怎么办 三岁宝宝有点口吃怎么办 3岁宝宝有点口吃怎么办 三岁宝宝说话有点口吃怎么办 六岁说话重复第一个字怎么办 宝贝烧到39.5度怎么办 宝贝39度不退烧怎么办 两岁多小儿突然变得口吃怎么办 百度两周岁宝宝口吃怎么办 2岁宝宝偶尔结巴怎么办 两岁宝宝说话磕巴怎么办 宝宝两岁结巴了怎么办 人多说话就紧张怎么办 小孩拉尿不叫人怎么办 2岁宝宝说话有点结巴怎么办 两岁半的宝宝说话结巴怎么办 2个月宝宝怕洗澡怎么办 2岁宝宝不喜欢喝奶粉怎么办 宝宝断奶不喜欢喝奶粉怎么办 宝宝不喜欢奶粉的味道怎么办 四个月宝宝不喜欢吃奶粉怎么办 四岁宝宝有口臭怎么办 4个月宝宝口臭怎么办 2岁宝宝有口臭是怎么办 两岁宝宝有口气怎么办 2岁宝宝口气重是什么原因怎么办 两岁宝宝口气重怎么办 两岁宝宝有口臭怎么办 两岁身高不达标怎么办 两岁宝宝82厘米怎么办 2岁幼儿说话结巴怎么办 2岁的宝宝结巴怎么办 2岁半宝宝口吃怎么办 2周岁宝宝不说话怎么办 三周岁宝宝不说话怎么办 2周岁宝宝突然说话结巴怎么办 两周岁宝宝突然说话结巴怎么办 三周岁宝宝说话突然结巴怎么办 小孩g和d不分怎么办 两岁宝宝皮肤黑怎么办 2岁宝宝肤色偏黄怎么办