您当前位置:地名问答 > 中国 > 浙江 > 杭州 > 西湖区 > 断桥残雪 > 断桥残雪地名
CString需要注意的地方(3)
更新:2017-08-18 01:51【断桥残雪地名】
导读:当多个对象共享同一块内存时,这块内存就属于多个对象,而不在属于原来的申请这块内存的那个对象了。但是,每个对象在其生命结束时,都首先将这块
当多个对象共享同一块内存时,这块内存就属于多个对象,而不在属于原来的申请这块内存的那个对象了。但是,每个对象在其生命结束时,都首先将这块内存的引用减一,然后再判断这个引用值,如果小于等于零时,就将其释放,否则,将之交给另外的正在引用这块内存的对象控制。
Cstring 使用这种数据结构,对于大数据量的字符串操作,可以节省很多频繁申请释放内存的时间,有助于提升系统胜能。
通过上面的分析,我们已经对Cstring 的内部机制已经有了一个大致的了解了。总的说来MFC 中的Cstring 是比较成功的。但是,由于数据结构比较复杂( 使用CstringData) ,所以在使用的时候就出现了很多的问题,最典型的一个就是用来描述内存块属胜的属胜值和实际的值不一致。出现这个问题的原因就是Cstring 为了方便某些应用,提供了一些operations ,这些operation 可以直接返回内存块中的字符串的地址值,用户可以通过对这个地址值指向的地址进行修改,但是,修改后又没有调用相应的operations1 使CstringData 中的值来保持一致。比如,用户可以首先通过operations 得到字符串地址,然后将一些新的字符增加到这个字符串中,使得字符串的长度增加,但是,由于是直接通过指针修改的,所以描述该字符串长度的CstringData 中的nDataLength 却还是原来的长度,因此当通过GetLength 获取字符串长度时,返回的必然是不正确的。
存在这些问题的operations 下面一一介绍。
1. GetBuffer
很多错误用法中最典型的一个就是Cstring:: GetBuffer () 了. 查了MSDN, 里面对这个operation 的描述是:
Returns a pointer to the internal character buffer for the CString object. The returned LPTSTR is not const and thus allows direct modification of CString contents 。
这段很清楚的说明,对于这个operation 返回的字符串指针,我们可以直接修改其中的值:
CString str1("This is the string 1");――――――――――――――――1
int nOldLen = str1.GetLength();―――――――――――――――――2
char* pstr1 = str1.GetBuffer( nOldLen );――――――――――――――3
strcpy( pstr1, "modified" );――――――――――――――――――――4
int nNewLen = str1.GetLength();―――――――――――――――――5
很赞哦! (82)