CString 中明明有值,但GetLength爲何返回0, IsEmpty 爲何是TRUE?

好久沒有寫。。TMD碰到大坑,實在忍不住吐槽前任。

碰到了白癡寫的代碼如下:

    CString strGet,strKey;
    strGet.Empty();

    strKey = _T("Mode");
    GetPrivateProfileString(_T("COMM"),strKey,_T("default"),strGet.GetBuffer(512),512,strConfigFilePath);
    m_strCommMode = strGet;

    strKey = _T("Serial");
    GetPrivateProfileString(_T("COMM"),strKey,_T("default"),strGet.GetBuffer(512),512,strConfigFilePath);
    ......

覺得萬般彆扭,果然在我後來調試時,發現了問題:

m_strCommMode 中明明有值,但GetLength爲何返回0, IsEmpty 爲何是TRUE?

因是生產環境,就 MessageBox/寫日誌查看裏面的值,發現都是正常,但TMD,GetLength爲何總返回0, IsEmpty 爲何總是TRUE?

單步調試後,才發現問題就是上面的GetBuffer()出現了問題,記住了:蛋炒飯必須要用隔夜飯炒,CString的GetBuffer也必須要和ReleaseBuffer配對使用!!!!!理由如下:


我們來看看MFC中ReleaseBuffer的代碼:

     void ReleaseBuffer( int nNewLength = -1 )
     {
          if( nNewLength == -1 )
          {
               nNewLength = StringLength( m_pszData );
          }
          SetLength( nNewLength );
     }
很明顯ReleaseBuffer只有一個作用,就是更新字符串的長度。CString內,GetLength獲取字符串長度並不是動態計算的,而是在賦值操作後計算並保存在一個int變量內的,當通過GetBuffer直接修改CString時,那個int變量並不可能自動更新,於是便有了ReleaseBuffer。
因此以上代碼加上s.ReleaseBuffer();後再s.GetLength()就OK了。

最後,或許是潔癖,實在忍不住,按我自己的套路來改寫了一下: 明明可以不用CString的啊!!

TCHAR szTemp[512];
memset( szTemp, 0, sizeof(szTemp) );
GetPrivateProfileString(_T("COMM"),_T("Mode"),_T("COM"), szTemp,512,strConfigFilePath);
m_strCommMode = szTemp;

m_nCommPort = GetPrivateProfileInt(_T("COMM"),_T("Serial"), 0, 512,strConfigFilePath);

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