GetBuffer和ReleaseBuffer是从其父类CSimpleStringT继承过来的。GetBuffer的作用是:“Returns a pointer to the internal character buffer”,ReleaseBuffer的作用是:“Releases control of the buffer allocated by GetBuffer.”。这两个函数的常见用法如下:

CString str;
const int bufferSize = 10;LPTSTR p = str.GetBuffer(bufferSize);
_tcscpy_s(p, bufferSize, _T("abcd1234.")); // use the buffer directly
str.ReleaseBuffer(); // Surplus(多余的) memory released, p is now invalid.

给GetBuffer函数传递的参数bufferSize,意思是:“The minimum size of the character buffer in characters. This value does not include space for a null terminator.”。对于调用ReleaseBuffer释放内存时,是否应该带参数,msdn是这样说的:“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.”。因为ReleaseBuffer函数的默认参数是-1,所以通常在调用ReleaseBuffer函数时省去-1参数的书写。

还有一点非常重要,看如下示例程序:

CString str;
const int bufferSize = 10;LPTSTR p = str.GetBuffer(bufferSize);
_tcscpy_s(p, bufferSize, _T("abcd")); // use the buffer directly
str.Append(_T("1234"));
str.ReleaseBuffer(); // Surplus(多余的) memory released, p is now invalid.

当程序执行完Append函数之后,程序员期望的是str字符串里保存的字符序列是abcd1234,但实际上并不是这样。有可能str的内容仍然为abcd,或者直接变为1234。这个问题在我之前的项目中曾经遇到过,最后才把问题定位到这里,来看msdn的注释:“If you use the pointer returned by GetBuffer to change the string contents, you must call ReleaseBuffer before using any other CSimpleStringT member methods.”。也就是说如果程序中通过GetBuffer 函数返回的字符指针修改了字符串的内容,那么必须在使用任何其他的CString类成员函数之前先调用ReleaseBuffer。

转载于:https://www.cnblogs.com/zhuyf87/archive/2012/11/02/2751011.html

CSting的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. 网站架构之统一数据服务平台技术
  2. [原创]java读写word文档,完美解决方案
  3. write()和read()
  4. reciprocity
  5. 从技术面试官的角度来谈谈简历和面试
  6. Module not found: Error: Can‘t resolve ‘sass-loader‘ in...
  7. 无线网和网吧服务器,网吧也无线?网吧无线网解决方案
  8. 创建线程的三种方法c语言,创建线程 - Python教程 - C语言网
  9. SCI论文全攻略之构思与撰文(二)
  10. Linux 通信机制 I/O多路复用之select
  11. php 获取xlsx,PHP Excel Reader读取xlsx文件
  12. 360校招——最后赢家(C++)
  13. 宏基因组定量、功能注释和高级分析代码
  14. 修改Matlab的背景颜色
  15. 基于Arduino的开源四轴飞行器开发学习板
  16. 搭建Kubernetes(k8s)集群(cka考试环境)
  17. webview 重定向
  18. 微信公众号项目开发笔记 一
  19. 使用Jrtplib实现RTP视频数据发送接收
  20. “数字化重构系统,搞定 CEO 是第一步”

热门文章

  1. linux中运行环境变量,linux下的环境变量详解
  2. 详细设计 存储分配_【存储论文笔记】Windows Azure Storage
  3. python同步远程文件夹_利用python实现两个文件夹的同步
  4. html嵌入python代码,python在html中插入简单的代码并加上时间戳的方法
  5. 蓝桥杯2017年第八届C/C++省赛B组第一题-购物单
  6. iOS socket 通讯 客户端和服务端(CocoaAsyncSocket 的用法)
  7. 夏令营提高班上午上机测试 Day 1 解题报告
  8. 1159 最大全0子矩阵
  9. 关于php中的json_encode和json_decode的”\“(反斜杠)的问题
  10. Python之面向对象2