转载:

http://blog.pfan.cn/xman/43212.html

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

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

LPTSTR GetBuffer( );LPTSTR GetBuffer(int nMinBufferLength);

在第二个版本中,当设定的长度小于原字符串长度时,nMinBufLength = nOldLen,该参数会被忽

略,不分配内存,指向原CString;当设定的长度大于原字符串本身的长度时就要重新分配(reallocate)一块比较大的空间出来。而调用第一个版本时,应如通过传入0来调用第二个版本一样。

是否需要在GetBufer后面调用ReleaseBuffer(),是根据你的后面的程序是否需要继续使用该字符串变量,并且是否动态改变其长度而定的。如果你GetBuffer以后程序自函数就退出,局部变量都不存在了,调用不调用ReleaseBuffer没什么意义了。

这是一个非常容易被用错的函数,主要可能是由于大家对它的功能不太了解。其实点破的话,也不是那么深奥。
    GetBuffer(int size)是用来返回一个你所指定大小可写内存的成员方法。它和被重载的操作符LPCTSTR还是有点本质区别的,LPCTSTR是直接返回一个只读内存的指针,而GetBuffer则是返回一个可以供调用者写入的内存,并且,你可以给定大小。下面是个简单的,但也是非常典型的例子:
    int readFile(CString& str, const CString& strPathName)
    {
        FILE* fp = fopen(strPathName, "r"); // 打开文件
        fseek(fp, 0, SEEK_END);
        int nLen = ftell(fp); // 获得文件长度
        fseek(fp, 0, SEEK_SET); // 重置读指针
        char* psz = str.GetBuffer(nLen);
        fread(psz, sizeof(char), nLen, fp); //读文件内容
        str.ReleaseBuffer(); //千万不能缺少
        fclose(fp);
    }
    上面的函数是GetBuffer函数最典型的用法了,其实它就相当于申请一块nLen大小的内存,只不过,这块内存是被引用在CString对象的内部而已,这是非常有效的一种用法,如果不直接用GetBuffer函数来申请的话,那么你必须用new操作符(或者malloc()函数)在CString的外部申请,然后再将申请的内存拷贝到CString对象中,显然这是一个非常冗余的操作,会使你函数的效率大大下降。
    ReleaseBuffer函数是用来告诉CString对象,你的GetBuffer所引用的内存已经使用完毕,现在必须对它进行封口,否则 CString将不会知道它现在所包含的字符串的长度,所以在使用完GetBuffer之后,必须立即调用ReleaseBuffer函数重置 CString的内部属性,其实也就是头部信息。

补充一下:

GetBuffer说白了就两个功能:

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

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

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

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

MSDN原文:

If you use the pointer returned by GetBuffer to change the string contents, you must call ReleaseBuffer before using any otherCSimpleStringT member methods.

The buffer memory is automatically freed when the CSimpleStringT object is destroyed.

If you keep track of the string length yourself, you should not append the terminating null character. You must, however, specify the final string length when you release the buffer with ReleaseBuffer. If you do append a terminating null character, you should pass –1 (the default) for the length to ReleaseBuffer, and ReleaseBuffer will perform a strlen on the buffer to determine its length.

GetBuffer与ReleaseBuffer相关推荐

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

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

  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功能和注意点

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

  4. [转载]对于GetBuffer() 与 ReleaseBuffer() 的一些分析

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

  5. CString之GetBuffer、ReleaseBuffer

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

  6. CString的GetBuffer和ReleaseBuffer

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

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

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

  8. CString:Getbuffer和Releasebuffer的作用

    首先看MSDN中的解释: CString::GetBuffer  LPTSTR GetBuffer( int nMinBufLength );    throw( CMemoryException ) ...

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

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

  10. CString之GetBuffer与ReleaseBuffer

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

最新文章

  1. GitLab CI流水线配置文件.gitlab-ci.yml详解(三)
  2. SAX解析xml (遍历DOM树各节点)
  3. 【计算机网络】网络层 : 总结 ( 功能 | 数据交换 | IP 数据报 | IPv4 地址 | IPv6 地址 | 路由选择协议 | 路由算法 )★★★
  4. Android之循环执行次数のHandlerRunnable
  5. 开源自制6通道航模遥控器,Arduino Pro Mini NRF24L01模块
  6. Kotlin 与 Java有什么区别(最全最新的)
  7. CVPR2021-PaperWithCode
  8. Java并发学习之一——线程的创建
  9. 荟萃分析6项研究表明炎症与骨赘形成有关联
  10. 在win32/安卓开发环境下编译BOX2D代码
  11. jpa多表联查动态_Spring Data JPA 连表动态条件查询
  12. 【Spring笔记】使用注解开发
  13. 【OOB】MSHTML!CPaste­Command::Convert­Bitmapto­Png heap-based buffer overflow学习
  14. GBS服装分床裁剪计划软件V4.0正式发布
  15. 网络蚂蚁(netants) v1.25 国际版 bt
  16. python opencv 修改局部区域像素值
  17. 【shell】shell创建虚拟环境virtualenv(-bash: virtualenv: command not found)
  18. 2022年河南省焊工高级技师理论知识模拟试题及答案
  19. iOS UIFont原生字体和第三方字体.ttf的使用
  20. Arduino教程4:面包板与洞洞板

热门文章

  1. 绝地求生服务器维护啥意思,2019绝地求生7月10日正式服维护内容详解介绍
  2. 使用在线路线逻辑分析仪ILA调试模块的小技巧
  3. Python文件读写缓冲区和文件读写操作实例
  4. 详细介绍别人电脑访问到自己电脑运行的项目
  5. 普鲁斯特问卷的26个问题
  6. FastJson与Jackson对比
  7. win10写java工具_jdk环境变量一键配置工具(Win10可用)
  8. Spring框架中都用到了哪些设计模式?
  9. 天猫盒子遥控器电池仓的设计缺陷
  10. Java学习---nginx虚拟主机域名配置