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

先 转载一段别人的文章

CString类的这几个函数, 一直在用, 但总感觉理解的不够透彻, 不时还有用错的现象. 今天抽时间和Nico一起分析了一下, 算是拨开了云雾: 
GetBuffer和ReleaseBuffer是一套需要配合使用的函数, 与GetBufferSetLength相比, 优点是如果分配的空间大于实际保存的字符串(0结尾), ReleaseBuffer会把多余申请的空间释放, 归还给系统; 但使用时需要注意以下问题: 如果要保存的字符串为abc(0结尾), 则GetBuffer参数应至少为3; 如果要保存的内容不是以0结尾, 比如是读取文件数据, 则GetBuffer参数如果大于文件长度时, ReleaseBuffer参数一定要为文件长度(如果GetBuffer参数为文件长度的话不存在问题, ReleaseBuffer参数可以为默认-1)! 
CString csStr;

LPTSTR lpsz = csStr.GetBuffer(100);

lpsz[0] = ‘a‘;

lpsz[1] = ‘b‘;

lpsz[2] = ‘/0‘;

csStr.ReleaseBuffer();

int nLength = csStr.GetLength();

/* n的值为2 */

GetBufferSetLength相对比较容易理解, 它申请一个指定长度的空间, 即使里面最终保存的字符串长度小于申请的空间长度, 也不会将多余空间释放. 
CString csStr;

LPTSTR lpsz = csStr.GetBufferSetLength(100);

lpsz[0] = ‘a‘;

lpsz[1] = ‘b‘;

lpsz[2] = ‘/0‘;

int nLength = csStr.GetLength();

/* n的值还是为100 */

对于红色部分,自己写代码时的确遇到过这样的问题:代码如下

CString temp; 
  ULONGLONG dwcount = Input_File.GetLength(); 
  //UINT dwcount = (UINT)Input_File.GetLength(); 
  Input_File.Read(temp.GetBuffer(dwcount),dwcount); 
  temp.ReleaseBuffer(dwcount);

若temp.ReleaseBuffer()不指定参数,执行这一步是会遇到错误,所以,类似的文件读取操作,releasebuffer的时候还是指定一个与getbuffer一样的参数为好

另:对于

(如果GetBuffer参数为文件长度的话不存在问题, ReleaseBuffer参数可以为默认-1)!

我设置temp.ReleaseBuffer(-1);此句执行的时候仍然出现错误,故还是指定文件长度为好

接下来看看其他的代码

CString str; 
BROWSEINFO bi; 
TCHAR name[MAX_PATH]; 
ZeroMemory(&bi,sizeof(BROWSEINFO)); 
bi.hwndOwner = GetSafeHwnd(); 
bi.pszDisplayName = name; 
bi.lpszTitle = _T("选择文件夹"); 
bi.ulFlags = BIF_RETURNFSANCESTORS; 
LPITEMIDLIST idl = SHBrowseForFolder(&bi); 
if(idl == NULL) 
  return;

SHGetPathFromIDList(idl, str.GetBuffer(MAX_PATH));

////1 
//CString aa = str.GetBuffer(MAX_PATH); 
//CString bb = str;                         //运行此句之后,str内容变成乱码 
//int a = aa.GetLength(); 
//int b = str.GetLength(); 
//LPTSTR cc = str.GetBuffer(MAX_PATH); 
//LPTSTR dd = bb.GetBuffer(MAX_PATH); 
//cc[1] = ‘a‘;

//bb.ReleaseBuffer();

debug 参数如下图所示:

////2   
CString aa = str.GetBuffer(MAX_PATH); 
int a = aa.GetLength(); 
int b = str.GetLength();                       //b无法获取str的长度 
LPTSTR cc = str.GetBuffer(MAX_PATH); 
cc[1] = ‘a‘; 
int e = str.GetLength();                       //e无法正确获取str的长度,与3不同之处在于此处的str在蓝色字体getbuffer后未releasebuffer                                                              //妥善的做法是在两次str.getbuffer与str.GetLength()之间都都releasebuffer()下。 
str.ReleaseBuffer();   
int d = str.GetLength();

debug 参数如下所示:

////3 
//CString aa = str.GetBuffer(MAX_PATH); 
//str.ReleaseBuffer(); 
//CString bb = str;                                  //bb的内容正确 
//int a = aa.GetLength(); 
//int b = str.GetLength(); 
//LPTSTR cc = str.GetBuffer(MAX_PATH); 
//LPTSTR dd = bb.GetBuffer(MAX_PATH); 
//cc[1] = ‘a‘; 
//int d = str.GetLength();                     //此处虽然可以正确获取str的值,但是在GetBuffer()后,最好还是在cc[1] = ‘a’ 后releasebuffer()一次。

//为何不再cc[1] = ‘a’前releasebuffer的原因: 虽然此处str仍然会变成”Ca/…..”,但是根据MSDN:在调用ReleaseBuffer之后,由GetBuffer返回的地址也许就无效了,因为其它的CString操作可能会导致CString缓冲区被重新分配。如果你没有改变此CString的长度,则缓冲区不会被重新分配。 妥当的做法是在cc[1]后releasebuffer

debug参数值如下所示:

////4

str.ReleaseBuffer();                                  //  对上面的SHGetPathFromIDList(idl, str.GetBuffer(MAX_PATH));  进行的释放操作 
CString aa = str.GetBuffer(MAX_PATH); 
CString bb = str;                                     // 执行完此句后,str的值不会变成乱码,和1类比 
int f = str.GetLength();                            //和1比,此处可以正确获取长度

str.ReleaseBuffer();  
int a = aa.GetLength(); 
int b = str.GetLength(); 
CString ff = str.GetBuffer(MAX_PATH); 
LPTSTR dd = bb.GetBuffer(MAX_PATH); 
int d = str.GetLength();

对于一个CString 进行GetBuffer后,在进行该CString 的其他 CString 函数操作(尤其是 “=” “+” 等容易忽视的 CString 操作)前ReleaseBuffer(虽然从此处的几段代码执行情况来看,表面上在GetBuffer后在一次执行 CString操作不会导致错误,但是进行第二次CString 操作时就会产生错误。为了安全起见,getbuffer后需要在次执行CString的函数操作,先ReleaseBuffer()).

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

时间: 2024-10-27 17:25:56

[转载]对于GetBuffer() 与 ReleaseBuffer() 的一些分析的相关文章

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

先 转载一段别人的文章 CString类的这几个函数, 一直在用, 但总感觉理解的不够透彻, 不时还实用错的现象. 今天抽时间和Nico一起分析了一下, 算是拨开了云雾: GetBuffer和ReleaseBuffer是一套须要配合使用的函数, 与GetBufferSetLength相比, 长处是假设分配的空间大于实际保存的字符串(0结尾), ReleaseBuffer会把多余申请的空间释放, 归还给系统; 但使用时须要注意下面问题: 假设要保存的字符串为abc(0结尾), 则GetBuffer

【转载+整理】Android中TouchEvent事件分析

原文地址:http://mobile.51cto.com/abased-374715.htm 一.知识回顾 一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTION_DOWN->ACTION_MOVE->ACTION_MOVE->ACTION_MOVE...->ACTION_MOVE->ACTION_UP 二.问题提出 当屏幕中包含一个ViewGroup,而这个ViewGroup又包含一个子view,这个时候android系统如何处理Touch事件呢?到底是 View

【转载】Joomla远程代码执行漏洞分析

利用脚本.exp:python jj.py http://123.123.123.123 ->直接GETSHELL python jj.py http://123.123.123.123 "whoami" ->执行命令#author:we8i&90sec import urllib2,urllib,base64 import cookielib,sys,re cj = cookielib.CookieJar() opener = urllib2.build_open

转载:AbstractQueuedSynchronizer的介绍和原理分析

简介 提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架.该同步器(以下简称同步器)利用了一个int来表示状态,期望它能够成为实现大部分同步需求的基础.使用的方法是继承,子类通过继承同步器并需要实现它的方法来管理其状态,管理的方式就是通过类似acquire和release的方式来操纵状态.然而多线程环境中对状态的操纵必须确保原子性,因此子类对于状态的把握,需要使用这个同步器提供的以下三个方法对状态进行操作: java.util.concurrent.locks.Abstra

【转载】12306铁道部订票网站性能分析

写的不错,推荐给大家. 12306.cn 网站挂了,被全国人民骂了,以这个事来粗略地讨论一下网站性能的问题.这是一篇长文,只讨论性能问题,不讨论那些UI,用户体验,或是是否把支付和购票下单环节分开的功能性的东西. 最近铁道部1.9亿外包订票网的事成为技术圈的热题.小编对钱和内幕神马的不懂,但当初和一个在亚马逊工作的高帅富码农聊时,被视无知,其实订票网站和百度,QQ,淘宝秒杀等负载不同.希望大家看看,就当学习,也没坏处. 业务 任何技术都离不开业务需求,所以,要说明性能问题,首先还是想先说说业务问

【转载】linux环境下tcpdump源代码分析

linux环境下tcpdump源代码分析 原文时间 2013-10-11 13:13:02   原文链接   主题 Tcpdump 作者:韩大卫 @ 吉林师范大学 tcpdump.c 是tcpdump 工具的main.c, 本文旨对tcpdump的框架有简单了解,只展示linux平台使用的一部分核心代码. Tcpdump 的使用目的就是打印出指定条件的报文,即使有再多的正则表达式作为过滤条件.所以只要懂得tcpdump -nXXi eth0 的实现原理即可. 进入main之前,先看一些头文件 n

转载(MySQL Order By实现原理分析和Filesort优化)

在MySQL中的ORDER BY有两种排序实现方式: 1.利用有序索引获取有序数据 2.文件排序 在使用explain分析查询的时候,利用有序索引获取有序数据显示Using index.而文件排序显示Using filesort. 1.利用有序索引获取有序数据 取出满足过滤条件作为排序条件的字段,以及可以直接定位到行数据的行指针信息,在 Sort Buffer 中进行实际的排序操作,然后利用排好序的数据根据行指针信息返回表中取得客户端请求的其他字段的数据,再返回给客户端. 这种方式,在使用exp

[转载] Java线程池框架源码分析

转载自http://www.linuxidc.com/Linux/2014-11/108791.htm 相关类Executor,Executors,AbstractExecutorService,ExecutorService Executor:整个线程池执行者框架的顶层接口.定义了一个execute方法,整个线程执行者框架的核心方法. public interface Executor { void execute(Runnable command);} ExecutorService:这是一

【转载】惊群问题的一些分析

Nginx学习之八-惊群问题 http://blog.csdn.net/xiajun07061225/article/details/9260535 “惊群”,看看nginx是怎么解决它的 http://russelltao.iteye.com/blog/1405352