实例测试CString的GetBuffer与ReleaseBuffer功能和注意点

​编者:李国帅​


背景原因:

回顾来自2006-10-19的资料

回看以前的记录,发现CString的GetBuffer与ReleaseBuffer这么个东西,自己还未必真的弄清楚,可又有几人真的去在意,去弄清楚呢?

为什么使用:

vc开发中,在进行字符串参数传递的时候,经常需要使用非常量指针,比如char*,wchar*,unsigned char*之类的参数。

         而我们通常得到的mfc字符串是CString,之后后需要先进行转换才能进行传递。

如何做:

对一个CString变量,你可以使用的唯一合法转换符是LPCTSTR。直接转换成LPTSTR(非常量指针)是错误的。

         (LPTSTR)(LPCTSTR) str; // WRONG!

         正确的得到一个指向缓冲区的非常量指针的方法是调用GetBuffer()方法。

         str.GetBuffer(0); // correct

 

接下来,让我们一步步使用例子看看如何使用GetBuffer()。

解决方案:

1、先看一个简单的例子

"This is a test "));
LPTSTR p = s.GetBuffer();
if(p != NULL) *p = _T('\0');
s.ReleaseBuffer();

 

2、什么意思呢,进行如下测试:

实例测试CString的GetBuffer与ReleaseBuffer功能和注意点_vc

能不能在ReleaseBuffer()之前通过字符串赋值放大字符串缓冲,我是以vc2010重新测试得出的结论,在其他开发环境未测试。

不过还是认为,ReleaseBuffer()之前直接操作CString字符串对象虽然没有错误,但不合适,因为字符串已经通过GetBuffer()把控制权已经给出去,再去干涉内部缓冲区,明显忘记了调用GetBuffer()的目的和意义。

 

3、内存操作

许多代码虽然看上去没有错误,但并不能保证没有错误。

请看下面的例子

 

实例测试CString的GetBuffer与ReleaseBuffer功能和注意点_GetBuffer_02

4、GetBuffer()参数的影响

GetBuffer()的参数是你需要CString为缓冲区分配的最小长度。

实例测试CString的GetBuffer与ReleaseBuffer功能和注意点_常量指针_03

5、调用ReleaseBuffer()之后,内存指针是否可用

实例测试CString的GetBuffer与ReleaseBuffer功能和注意点_CString_04