有一个函数void SetItemVal(CString A,CString B,CString C=_T(""))
{
           ///
}
过程:
CString m_StrA = _T("Param_A");
CString m_StrB = _T("Param_B");
SetItemVal(m_StrA,m_StrB );
跟踪进入SetItemVal,查看 C的值:
猜猜是多少?居然会出现与A相同的值!!!!!!!!!
然后查看原因
分析:  A    m_pchData 0x003f50ec "Param_A"        B   m_pchData 0x003f5144 "Param_B"        C   m_pchData 0x5f4ccb14 "Param_A"
一对比,发现 他们的Buf内存是相同的。
然后查看CString的构造函数:
CString(LPCSTR lpsz);
CString::CString(LPCTSTR lpsz)                          //传入的时候lpsz为_T(""),this对象为字符Buf空
{
Init();                      //但是执行了Init()之后t,his对象为字符Buf不为空,居然等于"Param_A"
if (lpsz != NULL && HIWORD(lpsz) == NULL)
{
UINT nID = LOWORD((DWORD)lpsz);
if (!LoadString(nID))
TRACE1("Warning: implicit LoadString(%u) failed\n", nID);
}
else
{
int nLen = SafeStrlen(lpsz);
if (nLen != 0)
{
AllocBuffer(nLen);
memcpy(m_pchData, lpsz, nLen*sizeof(TCHAR));
}
}
}
我就纳闷了啊!用一个_T("")buf来构造一个CString居然得到的是一个不为空的字符串?
求各位大侠慷慨相救啊!

解决方案 »

  1.   

    你是在哪里看到的值?watch窗口中吗?
      

  2.   

    我用watch窗口和MessageBox弹出的都是空啊
      

  3.   

    出问题多从自身找原因,CString自身出这种错误的可能极低。
      

  4.   

    要在debug版下调试,release版下看到的不正确。
      

  5.   

    这好像不是问题.
    对于长度为0的串,没有必要给m_pchData分配一个值,所以它有可能指向任何地址。反正CString对象知道串的长度为0。m_pchData 也不是给大家使用的。如果你确实需要获得指针的时候,m_pchData会给出正确的值。
    这样效率是最高的。
      

  6.   

    实际是这样的
    类:
    Class MYClass
    {
    public:
        void InitItem( CString strName,CString strIndex,CString strRef = _T());
    protected:
        CString m_StrName;
        CString m_StrIndex;
        CString m_StrRef
    };
    错误现象:
    MYClass a,b;
    a.InitItem( GetFileString(0),GetFileString(1));
    b.InitItem( GetFileString(2),GetFileString(3));
    c ....
    d..错误来了!  a中的 m_StrRef参数和 b中的m_StrRef参数公用一个内存Buf,当 a中的m_StrRef改变的时候,
    b c d e等等所有对象的m_StrRef都变为与a中的m_StrRef相同,既:所有对象的m_StrRef共用!!!
    方法
    CString GetFileString( UINT nID )
    {
      CString strResult;
      CString strKey = IDToString( nID );
      GetPrivateProfileString(.strKey,..strResult.GetBuffer(0)..)//这里检查过没问题
      Return strResult;
    }
    CString IDToString( UINT nID )
    {
    CString strResult;
     if( nID == 0)
     {
        strResult = _T("IDS_FILE_ATTR");
     }
     else if ( nID == 1)
     {
     strResult = _T("IDS_FILE_LAFG");
      }
    ..
    ..
    大约有几十条判断..
     return strResult;
    }
    好了,问题就出现在这里!!!!!
    我换了一种方法就解决了,不太清楚为什么
    struct  SIBO_INFO
    {
     UINT  nID;
     CString strVal;
    }
    CString IDToString( UINT nID )
    {
     static SIBO_INFO  infoArray[] =
    { 0,_T("IDS_FILE_ATTR")},
    { 1,_T("IDS_FILE_LAFG")},......
    .
    .
    .
     Static int nSize = sizeof(infoArray)/sizeof( SIBO_INFO);
     for( int i=0;i<nSize;i++)
    {
     if( infoArray[i] == nID )
    {
     strResult = infoArray[i].strVal;
     break;
     }
     return strResult;
    }
    }
     
    我那个郁闷啊 ,将上面的if判断改成 静态存储的数组,返回的CString最后就是正确的!!!
      

  7.   

    漏写了一个:InitItem中的参数strRef = _T(""))少了一个引号
      

  8.   

     void InitItem( CString strName,CString strIndex,CString strRef )
    {
      m_strName = strName;
      m_strIndex = strIndex;
      m_strRef = strRef;
    }
      

  9.   

    CString为了节省内存,会将相同的字符串保存到同样的内存区域中。另外0长度的它就不会再额外申请空间,因为CString自己知道字符串多长,即使它指向一个已有的字符串地址,也不会出问题的。除非你GetBuffer或者修改字符串时,它才会自动去申请额外的空间。