[MFC]對CString::GetBufferSetLength 和CString::GetBuffer區別的研究

在使用CString::GetBuffer()時遇到了一個問題,代碼如下:

Cstring sPath;

GetPrivateProfileString("Drivers","Type",sPath.GetBuffer(MAX_PATH),MAX_PATH,iniPath);

sPath.ReleaseBuffer();

int pos = sPath.Find("\\");

Cstring type = sPath.Left(pos);


經過調試,發現sPath的值爲ak\ddd.dll,pos=2,但是type的值爲ak\ddd.dll,並不是ak。

後來,將GetBuffer改爲GetBufferSetLength後沒問題了,經過查閱資料發現

1.CString對象中,字符串的長度信息保存在一個成員變量中(假設爲m_length),需要獲取字符串長度的時候直接讀取這個值。

2.GetBuffer分配了新的內存,但不改變m_length的值;GetBufferSetLength 也分配新的內存,同時將m_length的值設置爲參數中指定的值。

3.GetCurrentDirectory方法將工作目錄的路徑直接寫入path對象的內存,m_length的值沒有改變。這時,使用GetBuffer的版本m_length值爲0,使用GetBufferSetLength的版本m_length值爲MAX_PATH

接下來再看GetBufferSetLength方法的實現:

PXSTR GetBufferSetLength(int nLength) {

PXSTR pszBuffer = GetBuffer( nLength );

SetLength( nLength );

return( pszBuffer );

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章