关于Buffer的问题 C++之GetBuffer函数详解

简直就是弱爆了,原来所谓的buffer是抽象的呀

buffer就是系统分配给用户的一块数据存储单元,和变量其实是一样的呀,omyga!用于暂时存储用户数据

这个函数是为一个 CString对象重新获取其 内部字符缓冲区的指针,返回的LPTSTR为非const的,从而允许直接修改CString中的内容! 如果nMinBufLength 比当前buffer大,那么就调用ReleaseBuffer函数去释放当前的Buffer,用一个被请求的大小去覆盖这个buffer重新设定计数器为 0,如果在这之前你在这个buffer中调用了LockBuffer,那么你将失去你当前锁定的buffer
 
        如果你使用这个指向由GetBuffer所改变返回的字符串内容,那么在你使用CString其他CString方法之前你必须调用ReleaseBuffer。在调用ReleaseBuffer函数之后GetBuffer中的内容将无效(也就是销毁)
 
        当这个CString被销毁的时候,这个buffer所占用的内存将被自动释放
 
        注意: 如果你知道了这个字符串的长度,你不可以直接添加NULL字符了事,当你使用ReleaseBuffer的时候你必须指定最后的字符串长度,如果你仅仅添加了一个NULL字符结束符给这个字符串,你应该给ReleaseBuffer传递一个-1 当这个函数结束的时候_tcslen 将决定这个buffer的长度
  例子:
  // example for CString::GetBuffer
  CString s( "abcd" );//定义一个CString s并且初始化为abcd
  #ifdef _DEBUG
  afxDump << "CString s " << s << " ";
  #endif
  LPTSTR p = s.GetBuffer( 10 );//定义一个指针指向LPTSTR并接受GetBuffer所返回的地址
  lstrcpy( p, _T("Hello") ); // directly access CString buffer//使用Istrcpy将Hello]复制到该buffer中
  s.ReleaseBuffer( );//释放buffer
  #ifdef _DEBUG
  afxDump << "CString s " << s << " ";这时候s="Hello";
  #endif
        这是一个非常容易被用错的函数,主要可能是由于大家对它的功能不太了解。其实点破的话,也不是那么深奥。
 
        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的内部属性,其实也就是头部信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值