久久中文无码电影_免费观看四虎精品国产地址_亚洲国产成人久久综_亚洲无码动漫在线观看视频

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

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

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

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

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

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

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

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

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

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); }

};

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

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

pData->nAllocLength = nLen;

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

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

sizeof(CstringData) BYTE (nLen+1)TCHAR

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

    推薦鏈接:云南國旅