乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      GetBuffer與ReleaseBuffer的用法

       semo_zhang 2011-12-30

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

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

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

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

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

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

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

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

       

      補(bǔ)充一下:

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

      1:就是將CString里面的內(nèi)存交到外部一個(gè)來(lái)處理,外部可以直接修改它的內(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()也就是說(shuō),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è)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多