您的位置:首页 > Web前端

CString::GetBuffer ReleaseBuffer

2011-07-19 21:30 393 查看
来自:http://hi.baidu.com/idealsoft/blog/item/02d74322339097f6d6cae24e.html

这是一个非常容易被用错的函数,主要可能是由于大家对它的功能不太了解。其实点破的话,也不是那么深奥。

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的内部属性,其实也就是头部信息。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: