日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

GetBuffer與ReleaseBuffer的用法

 semo_zhang 2011-12-30

http://blog./xman/43212.html

GetBuffer()主要作用是將字符串的緩沖區(qū)長度鎖定,releaseBuffer則是解除鎖定,使得CString對象在以后的代碼中繼續(xù)可以實(shí)現(xiàn)長度自適應(yīng)增長的功能。

CString ::GetBuffer有兩個(gè)重載版本:

LPTSTR GetBuffer( );LPTSTR GetBuffer(int nMinBufferLength);

在第二個(gè)版本中,當(dāng)設(shè)定的長度小于原字符串長度時(shí),nMinBufLength = nOldLen,該參數(shù)會被忽

略,不分配內(nèi)存,指向原CString;當(dāng)設(shè)定的長度大于原字符串本身的長度時(shí)就要重新分配(reallocate)一塊比較大的空間出來。而調(diào)用第一個(gè)版本時(shí),應(yīng)如通過傳入0來調(diào)用第二個(gè)版本一樣。

是否需要在GetBufer后面調(diào)用ReleaseBuffer(),是根據(jù)你的后面的程序是否需要繼續(xù)使用該字符串變量,并且是否動(dòng)態(tài)改變其長度而定的。如果你GetBuffer以后程序自函數(shù)就退出,局部變量都不存在了,調(diào)用不調(diào)用ReleaseBuffer沒什么意義了。

這是一個(gè)非常容易被用錯(cuò)的函數(shù),主要可能是由于大家對它的功能不太了解。其實(shí)點(diǎn)破的話,也不是那么深?yuàn)W。
    GetBuffer(int size)是用來返回一個(gè)你所指定大小可寫內(nèi)存的成員方法。它和被重載的操作符LPCTSTR還是有點(diǎn)本質(zhì)區(qū)別的,LPCTSTR是直接返回一個(gè)只讀內(nèi)存的指針,而GetBuffer則是返回一個(gè)可以供調(diào)用者寫入的內(nèi)存,并且,你可以給定大小。下面是個(gè)簡單的,但也是非常典型的例子:
    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); //讀文件內(nèi)容
        str.ReleaseBuffer(); //千萬不能缺少
        fclose(fp);
    }
    上面的函數(shù)是GetBuffer函數(shù)最典型的用法了,其實(shí)它就相當(dāng)于申請一塊nLen大小的內(nèi)存,只不過,這塊內(nèi)存是被引用在CString對象的內(nèi)部而已,這是非常有效的一種用法,如果不直接用GetBuffer函數(shù)來申請的話,那么你必須用new操作符(或者malloc()函數(shù))在CString的外部申請,然后再將申請的內(nèi)存拷貝到CString對象中,顯然這是一個(gè)非常冗余的操作,會使你函數(shù)的效率大大下降。
    ReleaseBuffer函數(shù)是用來告訴CString對象,你的GetBuffer所引用的內(nèi)存已經(jīng)使用完畢,現(xiàn)在必須對它進(jìn)行封口,否則 CString將不會知道它現(xiàn)在所包含的字符串的長度,所以在使用完GetBuffer之后,必須立即調(diào)用ReleaseBuffer函數(shù)重置 CString的內(nèi)部屬性,其實(shí)也就是頭部信息。

 

補(bǔ)充一下:

GetBuffer說白了就兩個(gè)功能:

1:就是將CString里面的內(nèi)存交到外部一個(gè)來處理,外部可以直接修改它的內(nèi)容。

2:重新修改CString的內(nèi)存大小,這個(gè)數(shù)值不包含null結(jié)尾符。

另一個(gè)典型的用法:就是將CString里面的內(nèi)容變?yōu)閕nt或long型,需要先獲取里面的內(nèi)存指針。這樣就可以先GetBuffer(內(nèi)存大?。┓奖阒苯愚D(zhuǎn)換。

如果在外部修改了CString里面的內(nèi)容,在重新使用CString之前,需調(diào)用ReleaseBuffer()也就是說,ReleaseBuffer不需要每次都調(diào)用。

MSDN原文:

If you use the pointer returned by GetBuffer to change the string contents, you must call ReleaseBuffer before using any other CSimpleStringT member methods.

The buffer memory is automatically freed when the CSimpleStringT object is destroyed.

If you keep track of the string length yourself, you should not append the terminating null character. You must, however, specify the final string length when you release the buffer with ReleaseBuffer. If you do append a terminating null character, you should pass –1 (the default) for the length to ReleaseBuffer, and ReleaseBuffer will perform a strlen on the buffer to determine its length.

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多