对于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字)
(请认真阅读下面的提示信息)