精品伊人久久大香线蕉,开心久久婷婷综合中文字幕,杏田冲梨,人妻无码aⅴ不卡中文字幕

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
GetBuffer與ReleaseBuffer的用法

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

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

CString ::GetBuffer有兩個重載版本:

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

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

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

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

這是一個非常容易被用錯的函數(shù),主要可能是由于大家對它的功能不太了解。其實(shí)點(diǎn)破的話,也不是那么深奧。
    GetBuffer(int size)是用來返回一個你所指定大小可寫內(nèi)存的成員方法。它和被重載的操作符LPCTSTR還是有點(diǎn)本質(zhì)區(qū)別的,LPCTSTR是直接返回一個只讀內(nèi)存的指針,而GetBuffer則是返回一個可以供調(diào)用者寫入的內(nèi)存,并且,你可以給定大小。下面是個簡單的,但也是非常典型的例子:
    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對象中,顯然這是一個非常冗余的操作,會使你函數(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說白了就兩個功能:

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

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

另一個典型的用法:就是將CString里面的內(nèi)容變?yōu)閕nt或long型,需要先獲取里面的內(nèi)存指針。這樣就可以先GetBuffer(內(nèi)存大小)方便直接轉(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.

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
(轉(zhuǎn))CString詳解以及CString轉(zhuǎn)換成char* LPCTSTR LPSTR T...
CString 型和 char* 類型的相互轉(zhuǎn)化
Cstring類型轉(zhuǎn)換
vc中CString對象的GetBuffer()用法小結(jié)
關(guān)于CString的GetBuffer?和?ReleaseBuffer
GetBuffer--ReleaseBuffer問題
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

主站蜘蛛池模板: 巫山县| 苏尼特左旗| 鲁甸县| 普安县| 石首市| 东海县| 台江县| 池州市| 乌鲁木齐县| 上虞市| 梁山县| 宣武区| 新疆| 贵溪市| 革吉县| 阜宁县| 手游| 石阡县| 陇川县| 屯昌县| 淳化县| 乐都县| 中卫市| 景德镇市| 吉林省| 藁城市| 顺平县| 恭城| 科尔| 虹口区| 皮山县| 石阡县| 时尚| 石柱| 来凤县| 介休市| 阳山县| 宁乡县| 五大连池市| 华宁县| 晋城|