有一个函数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居然得到的是一个不为空的字符串?
求各位大侠慷慨相救啊!
{
///
}
过程:
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居然得到的是一个不为空的字符串?
求各位大侠慷慨相救啊!
对于长度为0的串,没有必要给m_pchData分配一个值,所以它有可能指向任何地址。反正CString对象知道串的长度为0。m_pchData 也不是给大家使用的。如果你确实需要获得指针的时候,m_pchData会给出正确的值。
这样效率是最高的。
类:
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最后就是正确的!!!
{
m_strName = strName;
m_strIndex = strIndex;
m_strRef = strRef;
}