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