mfc下cstring的部分用法:lpctstr 和getbuffer

cstring是mfc裏面相當好用的一個類,但是對與轉換爲char *的用法,很多人就不怎麼明白了,很多人是getbuffer(),lpctstr混用的

但是又不甚明瞭裏面的區別,簡單介紹下,留個記錄,防止以後忘掉了

cstring對效率的要求,導致了這個類在設計的時候使用了哪個lazy evaluation,多個對象互相賦值的時候,實際保存內容只有一份,使用引用計數,只有在某個對象寫操作的時候,纔會發生實質的創建內存+拷貝工作

以下是兩個函數的具體定義:

_AFX_INLINE CString::operator LPCTSTR() const
    { return m_pchData; }

 

 PXSTR GetBuffer()
    {
        CStringData* pData = GetData();
        if( pData->IsShared() )
        {
            Fork( pData->nDataLength );
        }

        return( m_pszData );
    }
可見主要區別就是lpctstr不關心你裏面有多少個對象指向這塊內存,

CString tmp("hello");
CString tmp2(tmp);
char *p=(LPSTR)(LPCTSTR)tmp2;
*p='a';

這樣的後果就是tmp,tmp2所指向的數據都變成了aello,這估計是與開發人員的想法有點不同的

 

getbuffer呢,就會去判斷是否多個對象指向他了,如果有,那就執行創建內存+拷貝工作,所以是肯定影響不到其他對象的

通過此代碼,也可以看出getbuffer不帶參數或者參數爲0的話,是不需要執行releasebuffer操作的

 

上面描述錯了,releasebuffer的唯一目的是調整getlength的返回值,所以如果對getbuffer只讀的話,都是沒必要releasebuffer的

但是一旦對cstring數據長度產生影響的寫操作發生的話,就必須要releasebuffer了,否則一旦執行其他的操作,比如makeupper之類的,

就會得到跟你想象中不一樣的結果,切記

cstring代碼來自vs2005

發佈了30 篇原創文章 · 獲贊 5 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章