CString之间赋值出现错误

近期在做MFC开发过程中,时不时的出现两个CString对象间赋值报断言错误,追到错误的地方是afx.inl的122行。

VC6.0查看afx.inl文件定位代码如下:

_AFX_INLINE CStringData* CString::GetData() const
{ ASSERT(m_pchData != NULL); return ((CStringData*)m_pchData)-1; }


根据错误信息,应该是m_pchData为空,造成对象赋值异常。

那么究竟是什么情况造成m_pchData为空呢?

经过同事提点,发现在自己定义的结构体中出现了CString 对象。

并使用了ZeroMemory()函数来初始化结构体,从而造成了CString对象的m_pchData为空。

我们知道CString的引用内存块的结构定义如下:

struct   CStringData 

    long   nRefs;               //表示有多少个CString   引用它.   4 
    int   nDataLength;     //串实际长度.   4 
    int   nAllocLength;   //总共分配的内存长度(不计这头部的12字节).   4 
 }; 
问题出现在两个地方:
1、结构体中使用了CString对象
2、使用了ZeroMemory()函数初始化结构体

ZeroMemory()函数会使得CString对象中内存块结构体中所有数据都清为0。

解决方法就是:
1、要么不要再结构体中使用CString对象
2、要么自定义清空结构体的函数,手动清空结构体的CString对象,而不至于把CString对象的m_pchData清为空。



你可能感兴趣的:(VS)