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

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值