GetBuffer与ReleaseBuffer的用法

GetBuffer与ReleaseBuffer的用法,CString剖析2008-06-07 22:39

    这是一个非常容易被用错的函数,主要可能是由于大家对它的功能不太了解。其实点破的话,也不是那么深奥。 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的内部属性,其实也就是头部信息。

posted @ 2011-12-14 19:34  rookieeeeee  阅读(425)  评论(0编辑  收藏  举报