首先模块的有关CMsg定义部分
class AFX_EXT_CLASS CMsg
{
... // 无关内容省略
public:
Cstring m_strName;
Cstring m_strPassword;
... // 无关内容省略
}然后在应用程序里的登录界面这样使用(这是个所有程序员都用得普通登录界面)
void CLoginDlg::OnOK()
{
UpdateData();
CMsg msg;
msg.m_strName = m_txtName; // m_txtName是CLoginDlg的成员变量
msg.m_strPassword = m_txtPassword; // m_txtName是CLoginDlg的成员变量
... // 无关内容省略
}编译通过(window server 2000sp3/visual c++6.0 sp3),然而在运行时出现Debug assertion Failed警告框!经调试错误出现在
msg.m_strName = m_txtName; // m_txtName是CLoginDlg的成员变量
这一行.继续跟踪,发现
void CString::Release()
{
if (GetData() != _afxDataNil)
{
ASSERT(GetData()->nRefs != 0);
if (InterlockedDecrement(&GetData()->nRefs) <= 0)
FreeData(GetData());
Init();
}
}
警告框就是上面
ASSERT(GetData()->nRefs != 0);
引起的百思不得其解,nRefs怎么会为0,不可思议!
望不吝教诲

解决方案 »

  1.   

    对就是这个!我也碰到过^_^,你还是用string吧,我改成string就好啦
      

  2.   

    因为CString内部使用了new来实现,跨模块的时候内容就释放了,所以会出现GetData()->nRefs != 0断言失败。一般的解决方法是把CString改成char *
      

  3.   

    我想不是这样的,可以看CString的定义,在跨模块这方面CString 有特别的定义,我不清楚这样定义有什么用处,但我想既然CString有跨模块的特殊定定义,就说明跨模块应用程序可以用CString 类一个变量释不释放应该和模块没有关系,因为有导出数据吗!导出数据的生命周期应该和非跨模块的数据一样的
    CMsg是导出类,当然他的所有共有函数以及变量都是导出的,
      

  4.   

    这个多半是因为不同的模块中 _afxDataNil 的值不同
      

  5.   

    最好使用TCHAR型的数组或者指针
      

  6.   


    建议将CString改为char* 试试
    也就是说在模块之间传递指针可能会好些。
      

  7.   

    用char*
    CString效率比较低。连微软自己都这么说。
      

  8.   

    直接改成Set方法吧。感觉你的代码应该没问题.
      

  9.   

    试试用GetBuffer()来调出CString对象的字符串值来。