我們知道,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的內部屬性,其實也就是頭部信息。