首先看MSDN中的解释:

CString::GetBuffer 
LPTSTR GetBuffer( int nMinBufLength ); 
  throw( CMemoryException ); 
返回值:一个指向对象的(以空字符结尾的)字符缓冲区的LPTSTR指针。 
参数:nMinBufLength  字符缓冲区的以字符数表示的最小容量。这个值不包括一个结尾的空字符的空间

说明: 
此成员函数返回一个指向CString对象的内部字符缓冲区的指针。返回的LPTSTR不是const,因此可以允许直接修改CString的内容。 
如果你使用由GetBuffer返回的指针来改变字符串的内容,你必须在使用其它的CString成员函数之前调用ReleaseBuffer函数。 
在调用ReleaseBuffer之后,由GetBuffer返回的地址也许就无效了,因为其它的CString操作可能会导致CString缓冲区被重新分配。 
如果你没有改变此CString的长度,则缓冲区不会被重新分配。 
当此CString对象被销毁时,其缓冲区内存将被自动释放。 
注意:如果你自己知道字符串的长度,则你不应该添加结尾的空字符。但是,当你用ReleaseBuffer来释放该缓冲区时,你必须指定最后的字符串长度。如果你添加了结尾的空字符,你应该给ReleaseBuffer的长度参数传递-1,ReleaseBuffer将对该缓冲区执行strlen来确定它的长度。

CString对象在内存中用一个计数器来维持可用缓冲区的大小

void ReleaseBuffer( int nNewLength = -1 )
{ if( nNewLength == -1 ) { nNewLength = StringLength( m_pszData ); } SetLength( nNewLength );
} 

很明显ReleaseBuffer的作用就是更新字符串的长度。 CString内,GetLength获取字符串长度并不是动态计算的,而是在赋值操作后计算并保存在一个int变量内的,当通过GetBuffer直接修改CString时,那个int变量并不可能自动更新,于是便有了ReleaseBuffer.

示例:下面的例子说明了如何用CString::GetBuffer和CString::ReleaseBuffer(最好逐步调试观察值和地址的变化)

#include <stdio.h>
#include <afxwin.h>void main(void)
{ CString s("abcd"); int i = s.GetLength(); printf("%s\n", s); printf("s length1 is %d\n", i);LPTSTR p = s.GetBuffer(6); strcpy( p, "12345"); printf("%s\n", s); int j = s.GetLength(); printf("s length2 is %d\n", j);s.ReleaseBuffer(); printf("%s\n", s);int k = s.GetLength(); printf("s length3 is %d\n", k);strcpy( p, "a1b2c3");     // 这里新指定的字串若为"a1b2c3e"则会在此中断
    printf("%s\n", s); int m = s.GetLength(); printf("s length4 is %d\n", m);
}

运行结果为:

注意:

1、CString对象内部的最后保留了'\0'字符,但是必须通过Getbuffer返回其指针后访问它才不会发生异常,如果用GetAt(GetLength())访问就会发生异常. 
2、GetBuffer函数与GetbufferSetLength中的参数如果大于字符串的实际长度,则自动开辟新增加的长度。当调用ReleaseBuf函数后,则新增加的缓冲区如果未被存放内容那么多于的内存就会被释放。如果参数小于字符串的实际长度,并且大于等于0,则利用返回的指针访问不会发生异常,并且如果未做任何修改操作,那么当调用ReleaseBuf函数后,还是保持原来的字符串内容部变。如果小于0则会发生异常。
3、通过指针p和字符串s 实行字符串动态增加的效果是完全不一样的,因为字符串s里有很多成员函数为之服务。

CString:Getbuffer和Releasebuffer的作用相关推荐

  1. Cstring GetBuffer 和 ReleaseBuffer

    GetBuffer()主要作用是将字符串的缓冲区长度锁定,releaseBuffer则是解除锁定,使得CString对象在以后的代码中继续可以实现长度自适应增长的功能. CString ::GetBu ...

  2. CString的GetBuffer与ReleaseBuffer

    http://blog.pfan.cn/xman/43212.html http://www.cnblogs.com/jamesmile/archive/2010/04/19/1715756.html ...

  3. CString::GetBuffer函数作用

    CString::GetBuffer  LPTSTR GetBuffer( int nMinBufLength ); throw( CMemoryException ); 对一个CString变量,你 ...

  4. CString的GetBuffer和ReleaseBuffer

    GetBuffer()主要作用是将字符串的缓冲区长度锁定,releaseBuffer则是解除锁定,使得CString对象在以后的代码中继续可以实现长度自适应增长的功能. CString ::GetBu ...

  5. MFC学习 CString内存泄漏的雷区——GetBuffer与ReleaseBuffer

    GetBuffer()主要作用是将字符串的缓冲区长度锁定,releaseBuffer则是解除锁定,使得CString对象在以后的代码中继续可以实现长度自适应增长的功能. CString ::GetBu ...

  6. GetBuffer与ReleaseBuffer的用法,CString剖析

    转载: http://blog.pfan.cn/xman/43212.html GetBuffer()主要作用是将字符串的缓冲区长度锁定,releaseBuffer则是解除锁定,使得CString对象 ...

  7. CString之GetBuffer与ReleaseBuffer

    我们知道,CString是MFC中提供的方便字符串操作的一个类,非常好使,具有自动动态内存管理功能. GetBuffer()主要作用是将字符串的缓冲区长度锁定: ReleaseBuffer()则是解除 ...

  8. MFC学习(27)CString内存泄漏的雷区——GetBuffer与ReleaseBuffer

    GetBuffer()主要作用是将字符串的缓冲区长度锁定,releaseBuffer则是解除锁定,使得CString对象在以后的代码中继续可以实现长度自适应增长的功能. CString ::GetBu ...

  9. MFC CString GetBuffer ReleaseBuffer方法

    一.函数原型 CString::GetBuffer LPTSTR GetBuffer( int nMinBufLength ); throw( CMemoryException ); Return V ...

最新文章

  1. 论文被拒,项目被砍?斯坦福最惨在读博士教你如何直面失败
  2. 工作中不要为了用系统而用系统
  3. mysql generator 命令_MyBatis Generator速查手册
  4. python这个软件学会能做什么工作-学会Python真的有高收入?盯,请查收这份入坑指南...
  5. MySQL主从压_mysql主从配置
  6. HDCVI——一种创新性的高清视频传输方案
  7. 解决Failed to connect session for conifg 故障
  8. 存储过程——介绍(一)
  9. 揭秘 Python 火爆背后的真实现状,2020 Python 开发者调查
  10. try...catch...finally的陷阱——加锁的线程开发经验分享
  11. Linux、命令ps 各字段意思
  12. 笔试题--计算组合数
  13. c语言游戏教程pdf,c语言编写小游戏系列教程之移动游戏人物,C_C++,自学去.pdf
  14. UltraISO9.3.0.2610中文绿色注册版
  15. 谷歌翻译停服后,chrome无法自动翻译?解决办法来了~
  16. python关闭指定浏览器页面_如何用Python关闭打开的网页
  17. UVALive 6657 GCD XOR 异或,因子筛法
  18. 10 个 jQuery 的360 度图片展示插件
  19. python pil grab screen
  20. 初见TIC66XX系列DSP——C6678

热门文章

  1. 全球及中国工业食品切割机行业商业模式分析及投资风险预测2022年版
  2. android动态申请悬浮框权限,Android动态权限申请工具(包括悬浮窗)
  3. 趣图:嘿Siri,我离职了!你懂得...
  4. 如何用最短的时间学会数据分析?
  5. 14 机器学习 - CF协同过滤推荐算法原理
  6. 数据库查询当前时间大全(MySQL、Oracle、Sqlserver)
  7. vue中用canvas画移动端电量显示 实现充电动画
  8. 盘点那些读书学习不可缺少的导图软件
  9. 爬虫实战|手把手教你用Python爬虫(附详细源码)
  10. Java对象转JOSN格式字符串,value设置为null被过滤问题