公文高手,超级方便的公文写作神器! 立即了解


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

先转载一段别人的文章

cstring类的这几个函数,一直在用,但总感觉理解的不够透彻,不时还有用错的现象.今天抽时间和nico一起分析了一下,算是拨开了云雾:

getbuffer和releasebuffer是一套需要配合使用的函数,与getbuffersetlength相比,优点是如果分配的空间大于实际保存的字符串(0结尾),releasebuffer会把多余申请的空间释放,归还给系统;但使用时需要注意以下问题:如果要保存的字符串为abc(0结尾),则getbuffer参数应至少为3;如果要保存的内容不是以0结尾,比如是读取文件数据,则getbuffer参数如果大于文件长度时,releasebuffer参数一定要为文件长度(如果getbuffer参数为文件长度的话不存在问题,releasebuffer参数可以为默认-1)。

cstringcsstr;

lptstrlpsz=csstr.getbuffer(100);

lpsz[0]='a';

lpsz[1]='b';

lpsz[2]='/0';

csstr.releasebuffer;

intnlength=csstr.getlength;

/*n的值为2*/

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

cstringcsstr;

lptstrlpsz=csstr.getbuffersetlength(100);

lpsz[0]='a';

lpsz[1]='b';

lpsz[2]='/0';

intnlength=csstr.getlength;

/*n的值还是为100*/

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

 cstringtemp;

 ulonglongdwcount=input_file.getlength;

 //uintdwcount=(uint)input_file.getlength;

 input_file.read(temp.getbuffer(dwcount),dwcount);

 temp.releasebuffer(dwcount);

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

另:对于

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

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

接下来看看其他的代码

cstringstr;

browseinfobi;

tcharname[max_path];

zeromemory(&bi,sizeof(browseinfo));

bi.hwndowner=getsafehwnd;

bi.pszdisplayname=name;

bi.lpsztitle=_t("选择文件夹");

bi.ulflags=bif_returnfsancestors;

lpitemidlistidl=shbrowseforfolder(&bi);

if(idl==null)

 return;

shgetpathfromidlist(idl,str.getbuffer(max_path));

////1


(未完,全文共5259字,当前显示1498字)

(请认真阅读下面的提示信息)


温馨提示

此文章为6点公文网原创,稍加修改便可使用。只有正式会员才能完整阅读,请理解!

会员不仅可以阅读完整文章,而且可以下载WORD版文件

已经注册:立即登录>>

尚未注册:立即注册>>

6点公文网 ,让我们一起6点下班!