成人免费无码污在线观看_欧美日韩国产中文字幕a暗网_欧美成人AⅤ在线视频免费_任你高潮潮喷淫吸尤物在线播放

昆明國(guó)際旅行社
昆明國(guó)際旅行社
新聞信息
推薦最新信息 Top 10
推薦旅游工具
電子地圖 電子地圖 云南租車 云南租車
天氣預(yù)報(bào) 天氣預(yù)報(bào) 旅游社區(qū)-昆明國(guó)際旅行社 旅游社區(qū)
酒店預(yù)訂-昆明國(guó)際旅行社 酒店預(yù)訂 云南特產(chǎn)-昆明國(guó)際旅行社 云南特產(chǎn)
航班動(dòng)態(tài)_昆明國(guó)際旅行社 航班動(dòng)態(tài) 高爾夫旅游_昆明國(guó)際旅行社 高爾夫旅游
推薦旅游用品
昆明國(guó)際旅行社
您現(xiàn)在的位置: 昆明國(guó)際旅行社 >>  地名問(wèn)答 > 國(guó)內(nèi) > 浙江 > 斷橋殘雪 >  >> 正文
 
CString需要注意的地方
CString需要注意的地方
本站:昆明國(guó)際旅行社   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):

很多的程序, 發(fā)現(xiàn)很大的一部分bug 是關(guān)于MFC 類中的Cstring 的錯(cuò)誤用法的. 出現(xiàn)這種錯(cuò)誤的原因主要是對(duì)Cstring 的實(shí)現(xiàn)機(jī)制不是太了解。

Cstring 是對(duì)于原來(lái)標(biāo)準(zhǔn)c 中字符串類型的一種的包裝。因?yàn),通過(guò)很長(zhǎng)時(shí)間的編程,我們發(fā)現(xiàn), 很多程序的bug 多和字符串有關(guān), 典型的有:緩沖溢出、內(nèi)存泄漏等。而且這些bug 都是致命的,會(huì)造成系統(tǒng)的癱瘓。因此c++ 里就專門的做了一個(gè)類用來(lái)維護(hù)字符串指針。標(biāo)準(zhǔn)c++ 里的字符串類是string ,在microsoft MFC 類庫(kù)中使用的是Cstring 類。通過(guò)字符串類,可以大大的避免c 中的關(guān)于字符串指針的那些問(wèn)題。

    這里我們簡(jiǎn)單的看看Microsoft MFC 中的Cstring 是如何實(shí)現(xiàn)的。當(dāng)然,要看原理,直接把它的代碼拿過(guò)來(lái)分析是最好的。MFC 里的關(guān)于Cstring 的類的實(shí)現(xiàn)大部分在strcore.cpp 中。

    Cstring 就是對(duì)一個(gè)用來(lái)存放字符串的緩沖區(qū)和對(duì)施加于這個(gè)字符串的操作封裝。也就是說(shuō),Cstring 里需要有一個(gè)用來(lái)存放字符串的緩沖區(qū),并且有一個(gè)指針指向該緩沖區(qū),該指針就是LPTSTR m_pchData 。但是有些字符串操作會(huì)增建或減少字符串的長(zhǎng)度,因此為了減少頻繁的申請(qǐng)內(nèi)存或者釋放內(nèi)存,Cstring 會(huì)先申請(qǐng)一個(gè)大的內(nèi)存塊用來(lái)存放字符串。這樣,以后當(dāng)字符串長(zhǎng)度增長(zhǎng)時(shí),如果增加的總長(zhǎng)度不超過(guò)預(yù)先申請(qǐng)的內(nèi)存塊的長(zhǎng)度,就不用再申請(qǐng)內(nèi)存。當(dāng)增加后的字符串長(zhǎng)度超過(guò)預(yù)先申請(qǐng)的內(nèi)存時(shí),Cstring 先釋放原先的內(nèi)存,然后再重新申請(qǐng)一個(gè)更大的內(nèi)存塊。同樣的,當(dāng)字符串長(zhǎng)度減少時(shí),也不釋放多出來(lái)的內(nèi)存空間。而是等到積累到一定程度時(shí),才一次勝將多余的內(nèi)存釋放。

   還有,當(dāng)使用一個(gè)Cstring 對(duì)象a 來(lái)初始化另一個(gè)Cstring 對(duì)象b 時(shí),為了節(jié)省空間,新對(duì)象b 并不分配空間,它所要做的只是將自己的指針指向?qū)ο?span>a 的那塊內(nèi)存空間,只有當(dāng)需要修改對(duì)象a 或者b 中的字符串時(shí),才會(huì)為新對(duì)象b 申請(qǐng)內(nèi)存空間,這叫做寫入復(fù)制技術(shù)(CopyBeforeWrite) 。

    這樣,僅僅通過(guò)一個(gè)指針就不能完整的描述這塊內(nèi)存的具體情況,需要更多的信息來(lái)描述。

   首先,需要有一個(gè)變量來(lái)描述當(dāng)前內(nèi)存塊的總的大小。其次,需要一個(gè)變量來(lái)描述當(dāng)前內(nèi)存塊已經(jīng)使用的情況。也就是當(dāng)前字符串的長(zhǎng)度。另外,還需要一個(gè)變量來(lái)描述該內(nèi)存塊被其他Cstring 引用的情況。有一個(gè)對(duì)象引用該內(nèi)存塊,就將該數(shù)值加一。

   Cstring 中專門定義了一個(gè)結(jié)構(gòu)體來(lái)描述這些信息:

struct CStringData

{

   long nRefs;             // reference count

   int nDataLength;        // length of data (including terminator)

   int nAllocLength;       // length of allocation

                            // TCHAR data[nAllocLength]

   TCHAR* data()           // TCHAR* to managed data

   { return (TCHAR*)(this+1); }

};

    實(shí)際使用時(shí),該結(jié)構(gòu)體的所占用的內(nèi)存塊大小是不固定的,在Cstring 內(nèi)部的內(nèi)存塊頭部,放置的是該結(jié)構(gòu)體。從該內(nèi)存塊頭部開始sizeof(CstringData) 個(gè)BYTE 后才是真正的用于存放字符串的內(nèi)存空間。這種結(jié)構(gòu)的數(shù)據(jù)結(jié)構(gòu)的申請(qǐng)方法是這樣實(shí)現(xiàn)的:

pData = (CStringData*) new BYTE[sizeof(CStringData) + (nLen+1)*sizeof(TCHAR)];

pData->nAllocLength = nLen;

其中nLen 是用于說(shuō)明需要一次勝申請(qǐng)的內(nèi)存空間的大小的。

從代碼中可以很容易的看出,如果想申請(qǐng)一個(gè)256 個(gè)TCHAR 的內(nèi)存塊用于存放字符串,實(shí)際申請(qǐng)的大小是:

sizeof(CstringData) 個(gè)BYTE (nLen+1) 個(gè)TCHAR

 
  • 精品推薦旅游線路精品推薦旅游線路
  • 昆明國(guó)際旅行社 昆明國(guó)際旅行社
    昆明國(guó)際旅行社
    【公司全稱】昆明國(guó)際旅行社
    【誠(chéng)信旅游】云南5星級(jí)誠(chéng)信旅行社
    【移動(dòng)電話】01588783000 (全天)
    【業(yè)務(wù) Q Q】276855576
    【網(wǎng)站聯(lián)系人】客服:小鄭 小張
    【網(wǎng)站負(fù)責(zé)人】手機(jī):15887830008
    【匯款名稱】昆明國(guó)際旅行社
    【公司帳號(hào)】2402 7501 0400 *****(人民幣)
    【公司地址】昆明市北京路83號(hào)昆明國(guó)際旅行社
    【公司網(wǎng)址】http://www.graceforlivingministries.com
    【溫馨提示】外地游客預(yù)付訂金時(shí)請(qǐng)匯到公司帳號(hào) 【互換鏈接】請(qǐng)加管理員QQ:276855576
    出境合同國(guó)內(nèi)合同
    昆明國(guó)際旅行社|云南旅游|昆明旅游|大理旅游|麗江旅游|梅里雪山|昆明自助游攻略|云南自助游攻略|風(fēng)景圖片|www.kunmingguoji.com|昆明市旅游租車

    推薦鏈接:云南國(guó)旅