zoukankan      html  css  js  c++  java
  • CString之GetBuffer与ReleaseBuffer

      我们知道,CString是MFC中提供的方便字符串操作的一个类,非常好使,具有自动动态内存管理功能。

      GetBuffer()主要作用是将字符串的缓冲区长度锁定;

      ReleaseBuffer()则是解除对缓冲区的锁定,这样使得CString对象在以后的代码中继续可以实现长度自适应增长的功能。

      

      GetBuffer()说白了就两个功能:

      1:就是将CString里面的内存交到外部一个来处理,外部可以直接修改它的内容。

      2:重新修改CString的内存大小,这个数值不包含null结尾符。

      另一个典型的用法:就是将CString里面的内容变为int或long型,需要先获取里面的内存指针。这样就可以先GetBuffer(内存大小)方便直接转换。

      如果在外部修改了CString里面的内容,在重新使用CString之前,需调用ReleaseBuffer()也就是说,ReleaseBuffer()不需要每次都调用。

      CString::GetBuffer有两个重载版本:

      LPTSTR GetBuffer( );

      LPTSTR GetBuffer(int nMinBufferLength);

      在第二个版本中,当设定的长度小于原字符串长度时,nMinBufLength = nOldLen,该参数会被忽略,不分配内存,指向原CString;当设定的长度大于原字符串本身的长度时就要重新分配(reallocate)一块比较大的空间出来。

      而调用第一个版本时,应如通过传入0来调用第二个版本一样。

      是否需要在GetBufer()后面调用ReleaseBuffer(),是根据你的后面的程序是否需要继续使用该字符串变量,并且是否动态改变其长度而定的。

      如果你GetBuffer()以后程序自函数就退出,局部变量都不存在了,调用不调用ReleaseBuffer()没什么意义了。


         GetBuffer(int size)是用来返回一个你所指定大小可写内存的成员方法。它和被重载的操作符LPCTSTR还是有点本质区别的,LPCTSTR是直接返回一个只读内存的指针,而GetBuffer则是返回一个可以供调用者写入的内存,并且,你可以给定大小。

      下面是个简单的,但也是非常典型的例子:

     1 int readFile(CString& str, const CString& strPathName)
     2 {
     3       FILE* fp = fopen(strPathName, "r");
     4       fseek(fp, 0, SEEK_END);
     5       int nLen = ftell(fp); 
     6       fseek(fp, 0, SEEK_SET); 
     7       char* psz = str.GetBuffer(nLen);
     8       fread(psz, sizeof(char), nLen, fp); 
     9       str.ReleaseBuffer();
    10       fclose(fp);
    11 }

      上面的函数是GetBuffer()函数最典型的用法了,其实它就相当于申请一块nLen大小的内存,只不过,这块内存是被引用在CString对象的内部而已,这是非常有效的一种用法,如果不直接用GetBuffer函数来申请的话,那么你必须用new操作符(或者malloc()函数)在CString的外部申请,然后再将申请的内存拷贝到CString对象中,显然这是一个非常冗余的操作,会使你函数的效率大大下降。
      ReleaseBuffer()函数是用来告诉CString对象,你的GetBuffer()所引用的内存已经使用完毕,现在必须对它进行封口,否则 CString将不会知道它现在所包含的字符串的长度,所以在使用完GetBuffer()之后,必须立即调用ReleaseBuffer()函数重置CString的内部属性,其实也就是头部信息。

  • 相关阅读:
    记录下QCustomPlot 热力图的用法
    Qt QChart 创建图表
    Qt TCP 简单通信
    Qt 设置Qt::FramelessWindowHint 后界面无法移动问题的一种解决方案
    Qt 操作 Excel 的相关文档
    Microsoft Word Application Reference Qt 操作word 的操作文档
    Python 进行excel查重
    Qt QPainter画个球啊
    Redis持久性文档中文翻译
    Docker 课前预习
  • 原文地址:https://www.cnblogs.com/MakeView660/p/6046612.html
Copyright © 2011-2022 走看看