网站策划内容,seo咨询推广找推推蛙,网站建设的主要技术指什么软件,东莞东城网站建设我们知道#xff0c;CString是MFC中提供的方便字符串操作的一个类#xff0c;非常好使#xff0c;具有自动动态内存管理功能。 GetBuffer()主要作用是将字符串的缓冲区长度锁定#xff1b; ReleaseBuffer()则是解除对缓冲区的锁定#xff0c;这样使得CString对象在以后的代… 我们知道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的内部属性其实也就是头部信息。转载于:https://www.cnblogs.com/MakeView660/p/6046612.html