我们知道,CString是MFC中提供的方便字符串操作的一个类,非常好使,具有自动动态内存管理功能。

  GetBuffer()主要作用是将字符串的缓冲区长度锁定;

  ReleaseBuffer()则是解除对缓冲区的锁定,这样使得CString对象在以后的代码中继续可以实现长度自适应增长的功能。

  

  GetBuffer()说白了就两个功能:

  1:就是将CString里面的内存交到外部一个来处理,外部可以直接修改它的内容。

  2:重新修改CString的内存大小,这个数值不包含null结尾符。

  另一个典型的用法:就是将CString里面的内容变为int或long型,需要先获取里面的内存指针。这样就可以先GetBuffer(内存大小)方便直接转换。

  如果在外部修改了CString里面的内容,在重新使用CString之前,需调用ReleaseBuffer()也就是说,ReleaseBuffer()不需要每次都调用。

  CString::GetBuffer有两个重载版本:

  LPTSTR GetBuffer( );

  LPTSTR GetBuffer(int nMinBufferLength);

  在第二个版本中,当设定的长度小于原字符串长度时,nMinBufLength = nOldLen,该参数会被忽略,不分配内存,指向原CString;当设定的长度大于原字符串本身的长度时就要重新分配(reallocate)一块比较大的空间出来。

  而调用第一个版本时,应如通过传入0来调用第二个版本一样。

  是否需要在GetBufer()后面调用ReleaseBuffer(),是根据你的后面的程序是否需要继续使用该字符串变量,并且是否动态改变其长度而定的。

  如果你GetBuffer()以后程序自函数就退出,局部变量都不存在了,调用不调用ReleaseBuffer()没什么意义了。

GetBuffer(int size)是用来返回一个你所指定大小可写内存的成员方法。它和被重载的操作符LPCTSTR还是有点本质区别的,LPCTSTR是直接返回一个只读内存的指针,而GetBuffer则是返回一个可以供调用者写入的内存,并且,你可以给定大小。

  下面是个简单的,但也是非常典型的例子:

 1 int readFile(CString& str, const CString& strPathName)
 2 {
 3       FILE* fp = fopen(strPathName, "r");
 4       fseek(fp, 0, SEEK_END);
 5       int nLen = ftell(fp);
 6       fseek(fp, 0, SEEK_SET);
 7       char* psz = str.GetBuffer(nLen);
 8       fread(psz, sizeof(char), nLen, fp);
 9       str.ReleaseBuffer();
10       fclose(fp);
11 }

  上面的函数是GetBuffer()函数最典型的用法了,其实它就相当于申请一块nLen大小的内存,只不过,这块内存是被引用在CString对象的内部而已,这是非常有效的一种用法,如果不直接用GetBuffer函数来申请的话,那么你必须用new操作符(或者malloc()函数)在CString的外部申请,然后再将申请的内存拷贝到CString对象中,显然这是一个非常冗余的操作,会使你函数的效率大大下降。
  ReleaseBuffer()函数是用来告诉CString对象,你的GetBuffer()所引用的内存已经使用完毕,现在必须对它进行封口,否则 CString将不会知道它现在所包含的字符串的长度,所以在使用完GetBuffer()之后,必须立即调用ReleaseBuffer()函数重置CString的内部属性,其实也就是头部信息。

CString之GetBuffer与ReleaseBuffer相关推荐

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

    实例测试CString的GetBuffer与ReleaseBuffer功能和注意点 编者:李国帅 qq:9611153 微信lgs9611153 时间:2019-02-22 背景原因: 回顾来自200 ...

  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、ReleaseBuffer

    LPTSTR GetBuffer( int nMinBufLength ); nMinBufLength为buffer的字符长度,不包括结束符 返回CString对象的内部buffer指针,非cons ...

  4. CString的GetBuffer和ReleaseBuffer

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

  5. CString的GetBuffer和ReleaseBuffer使用说明

    先看一段代码: #include <atlstr.h>//测试CStringint main(int argc, _TCHAR* argv[]) {CStringA strTemp = & ...

  6. CString的GetBuffer()主要作用是将字符串的缓冲区长度锁定,releaseBuffer则是解除锁定

    CString str; CStringArray array; GetPrivateProfileString(_T("策略参数"), _T("ROI1"), ...

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

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

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

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

  9. 对于GetBuffer() 与 ReleaseBuffer() 的一些分析

    先 转载一段别人的文章 CString类的这几个函数, 一直在用, 但总感觉理解的不够透彻, 不时还有用错的现象. 今天抽时间和Nico一起分析了一下, 算是拨开了云雾: GetBuffer和Rele ...

最新文章

  1. mysql 4.1.10_Mysql4.1.10初级解读
  2. [BZOJ4766]文艺计算姬
  3. jquery 选项卡插件
  4. 02-maven常用命令,以及使用命令创建目录
  5. 完美解决tomcat/springboot启动速度相当慢 快死的状态了
  6. Django 后台带有字典的列表数据与页面js交互
  7. iOS开发——高级技术通讯录功能的实现
  8. 在unity用shaderGraph做出类似动物之森的柱面场景,甚至球面场景。
  9. IE、Firefox和 Chrome长时间打开后内存都会变很大。
  10. Linux下常用安全策略设置方法
  11. 深度置信网络(DBN)
  12. Python爬虫学习(八)----scrapy框架
  13. 关于计算机二进制编码的游戏,二进制编码数字
  14. errors and 0 warnings potentially fixable with the `--fix` option
  15. 如何利用java打开本地exe文件
  16. python闯关训练营怎么样3.0_泡着枸杞写bug的三流程序员凭什么逆袭到一线大厂?...
  17. 遍历HashMap中元素的三种方法
  18. 计算机专业英语 学习笔记 6
  19. unity3d加载外部图片
  20. OpenCV+VTK 读书笔记

热门文章

  1. 可以拍照翻译软件有哪些?快来看看这些软件
  2. android音乐播放器 毕业论文,毕业论文-- 基于Android系统的音乐播放器的实现 .doc...
  3. 计算机硬件技术基础(太原理工大学):第四章
  4. 苹果怎么修改服务器密码,iPhone突然弹出窗口输入或修改ID密码如何解决
  5. 在Ubuntu 20.04 LTS Focal Fossa上安装VMware Tools
  6. tensorflow预处理:数据标准化的几种方法
  7. 云计算与服务器高校教材,高校云计算的发展与建设
  8. mysql高可用方案_MySQL高可用集群方案
  9. keepalived + HAProxy + mysql高可用
  10. C++中std::allocator的使用