您当前位置:地名问答 > 中国 > 浙江 > 杭州 > 西湖区 > 断桥残雪 > 断桥残雪地名

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)

相关文章