实例测试CString的GetBuffer与ReleaseBuffer功能和注意点
实例测试CString的GetBuffer与ReleaseBuffer功能和注意点
qq:9611153 微信lgs9611153
时间:2019-02-22
背景原因:
回顾来自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、先看一个简单的例子
CString s(_T("This is a test ")); LPTSTR p = s.GetBuffer(); if(p != NULL) *p = _T('\0'); s.ReleaseBuffer(); |
2、什么意思呢,进行如下测试:
能不能在ReleaseBuffer()之前通过字符串赋值放大字符串缓冲,我是以vc2010重新测试得出的结论,在其他开发环境未测试。
不过还是认为,ReleaseBuffer()之前直接操作CString字符串对象虽然没有错误,但不合适,因为字符串已经通过GetBuffer()把控制权已经给出去,再去干涉内部缓冲区,明显忘记了调用GetBuffer()的目的和意义。
3、内存操作
许多代码虽然看上去没有错误,但并不能保证没有错误。
请看下面的例子
4、GetBuffer()参数的影响
GetBuffer()的参数是你需要CString为缓冲区分配的最小长度。