如题,我在主对话框(如CMyDlg)执行某一事件时给另一个类(如CImageContainer)的CString类型成员变量赋值时出现了这样的问题。在debug单步跟踪下,每执行到给对象(CString)赋值时就出现下述的错误:   
  unhandled   exception   in   MyContainer.exe   (msvcrtd.dll):0x0000005:access   violation.   
点击确认后错误指向STRCORE.cpp的AllocBeforeWrite等函数的这一行:
   void CString::AllocBeforeWrite(int nLen)
  {
if (GetData()->nRefs > 1 || nLen > GetData()->nAllocLength) //错误指向这一行 {
Release();
AllocBuffer(nLen);
}
ASSERT(GetData()->nRefs <= 1);
  }请高手指点!

解决方案 »

  1.   

        如题,我在主对话框(如CMyDlg)执行某一事件时给另一个类(如CImageContainer)的CString类型成员变量赋值时出现了这样的问题。在debug单步跟踪下,每执行到给对象(CString)赋值时就出现下述的错误:       
        unhandled  exception  in  MyContainer.exe (msvcrtd.dll):0x0000005:access  violation.       
    点击确认后错误指向STRCORE.cpp的AllocBeforeWrite等函数的这一行: 
         void CString::AllocBeforeWrite(int nLen)
        {
    if (GetData()->nRefs > 1 || nLen > GetData()->nAllocLength) ////错误指向这一行
    {
    Release();
    AllocBuffer(nLen);
    }
    ASSERT(GetData()->nRefs <= 1);
        }请高手指点! 
      

  2.   

    看看要被赋值的CString对象是不是有效的
    看样子是GetData()的返回值是空的
      

  3.   

    CString对象的内容被破坏了,应该是执行过错误操作,比如GetBuffer之后没有ReleaseBuffer之类的
      

  4.   

    CString对象的内容被破坏了,比如GetBuffer之后没有ReleaseBuffer之类的。
    看例子
    CString str1("This is the string1");
    int nOldLen = str1.GetLength();
    char * pstr1 = str1.GetBuffer(nOldLen);
    strcpy(pstr1,"modified");
    //str1.ReleaseBuffer();//这句话不去掉和去掉的时候看nNewLen的值。
    int nNewLen = str1.GetLength();
      

  5.   

    总觉得是少了releasebuffer的问题
      

  6.   

    也许你在进行相关操作的时候,你的CImageContainer类没有创建成功,或者关于这个类的指针你没有找对,导致里面的成员变量也是创建失败的,所以当你要调用CImageContainer类的方法设置CImageContainer的成员变量时,就会出错。运行出现这个unhandled exception in  MyContainer.exe (msvcrtd.dll):0x0000005:access violation.  是因为CString的内部机制,当你创建一个CString对象,它会为改变量分配内存,然而你这里没有成功创建这个对象时,你要想获取该对象的地址,就出错了。