<span id="z3at8"><optgroup id="z3at8"><center id="z3at8"></center></optgroup></span>

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

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

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

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

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

         還有,當使用一個Cstring 對象a 來初始化另一個Cstring 對象b 時,為了節省空間,新對象b 并不分配空間,它所要做的只是將自己的指針指向對象a 的那塊內存空間,只有當需要修改對象a 或者b 中的字符串時,才會為新對象b 申請內存空間,這叫做寫入復制技術(CopyBeforeWrite)

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

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

         Cstring 中專門定義了一個結構體來描述這些信息:

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

      };

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

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

      pData->nAllocLength = nLen;

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

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

      sizeof(CstringData) BYTE (nLen+1)TCHAR

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

      推薦鏈接:云南國旅

      精品国产一区二区三区香蕉| 欧美性猛交xxxx| 亲密爱人免费完整在线观看| 波多野结衣有一部紧身裙女教师| 吃奶呻吟打开双腿做受在线视频| 羞羞视频在线播放| 四虎成人免费大片在线| 精产国品一二三产区M553| 别揉我的胸~啊~嗯~的视频| 狠狠综合亚洲综合亚洲色| 人人妻人人澡人人爽人人精品浪潮 | 纯爱无遮挡h肉动漫在线播放| 国产在线2021| 红颜免费观看动漫完整版| 可以免费看黄的网站| 特级欧美老少乱配| 亚洲精品亚洲人成在线播放| 欧美一级视频在线观看| 亚洲bt欧美bt精品| 日本处888xxxx| 久久99精品久久久久久不卡| 学霸c了我一节课| heyzo高清中文字幕在线| 国产精自产拍久久久久久| 6080午夜乱理伦片| 国产成人AAAAA级毛片| 翁虹三级在线伦理电影| 午夜影视在线观看| 毛片免费在线观看| 亚洲国产电影在线观看| 日本边添边摸边做边爱喷水| 久久久久久亚洲精品中文字幕 | 日日夜夜天天干| 中文字幕日本最新乱码视频| 天天摸天天躁天天添天天爽| 99久久人妻精品免费二区| 国产最新在线视频| 羞羞歪歪汗汗漫画| 免费大黄网站在线观看| 欧美在线视频二区| 久久精品欧美日韩精品|