实例测试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为缓冲区分配的最小长度。

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

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微澜-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值