本人用VC6在写一个程序。
最初编写时,使用了126组数据,一切正常。
但前日将数据量增加至1500组时,出现对一个之前正常的CStirng变量的操作为非法的错误消息,点击调试按钮,出现一个消息框内容如下:
“Unhandled exception in TBT.exe: 0xC0000005: Access Violation”
确定后,工作窗口部分内容:
  ...
  00409305   lea         ebx,[esi+73A0h]
  0040930B   lea         ecx,[esp+14h]
>>0040930F   mov         eax,dword ptr [eax-8]
  00409312   push        eax
  00409313   push        411708h
  ...
工作窗口下方的错误消息框内容如下:
Loaded 'E:\TBT\Release\TBT.exe', no matching symbolic information found.
Loaded 'C:\WINDOWS\Downloaded Program Files\CNSMIN.DLL', no matching symbolic information found.
Loaded 'C:\WINDOWS\SYSTEM\VERSION.DLL', no matching symbolic information found.
Loaded 'C:\WINDOWS\SYSTEM\SHLWAPI.DLL', no matching symbolic information found.
Loaded 'C:\WINDOWS\SYSTEM\COMCTL32.DLL', no matching symbolic information found.
Loaded 'C:\WINDOWS\SYSTEM\IMM32.DLL', no matching symbolic information found.
Loaded 'C:\WINDOWS\SYSTEM\MFC42.DLL', no matching symbolic information found.
Loaded 'C:\WINDOWS\SYSTEM\MFC42LOC.DLL', no matching symbolic information found.
Loaded 'C:\WINDOWS\SYSTEM\USER32.DLL', no matching symbolic information found.
Loaded 'C:\WINDOWS\SYSTEM\GDI32.DLL', no matching symbolic information found.
Loaded 'C:\WINDOWS\SYSTEM\ADVAPI32.DLL', no matching symbolic information found.
Loaded 'C:\WINDOWS\SYSTEM\MSVCRT.DLL', no matching symbolic information found.
Loaded 'C:\WINDOWS\SYSTEM\KERNEL32.DLL', no matching symbolic information found.

解决方案 »

  1.   

    程序通过编译连接。
    上面提到的数据存储在一个文件中,供程序运行时调用。
    且CStirng变量在程序运行的前半部分的操作未产生非法操作,在后半部分产生非法操作。
      

  2.   

    CString的原因,每次的数据不可以超过1000个字符。如果超过马上异常。
      

  3.   

    Re: KcSoft(KcSoft) 
      “CString每次的数据不可以超过1000个字符。如果超过马上异常。”
    不可能吧?在数据量增加之前(即使用126组数据时)CString的长度就大大的超过了1000个字符。但程序运行正常无误。再说,CStirng变量按程序设计,其长度在数据量增加前后是不会有变化的,他是按特定的格式保存对数据的统计信息。
      

  4.   

    CString info="";  //CStirng变量Statistic();  //统计:函数中未包含任何对info变量的操作,函数无返回值;
    StatisticReport();  //统计:函数中包含了大量对info变量的操作,函数无返回值;在程序中上面的两个函数紧挨着执行,中间没有任何执行代码。现在,我在“Statistic()”函数所有语句之后及“StatisticReport()”函数所有语句之前分别加入下列语句
    CString bt;
    bt.Format("长度:%d",info.GetLength());
    MessageBox(bt);编译后执行到“Statistic()”函数,显示消息“长度:0”;
    执行到“StatisticReport()”函数,显示消息“该程序执行了非法操作,即将关闭。...”;
    点击调试按钮,即出现本贴主题内容中的信息。
      

  5.   

    数据量增加至1500组时,////
    说明是增加数据时才出问题,如果你不信,你可以直接写1000个字符拷入变量,
    CString str;
    str.format("%s","1000个字符........");
    当然,你还可以用2000个字符试试.
    程序肯定异常的.
      

  6.   

    Re : KcSoft(蓝色的珍珠)
    参照上面2层的内容,我做了一个测试:在“Statistic()”函数所有语句之后加入以下语句CString bt;
    bt.Format("长度:%d",info.GetLength()); //info为public
    MessageBox(bt);显示info长度为9512。在“StatisticReport()”函数所有语句之前加入以下语句info+="a";
    CString bt;
    bt.Format("长度:%d",info.GetLength()); //info为public
    MessageBox(bt);
    MessageBox("通过");显示非法操作,说明错误出现在MessageBox("通过");语句之前。
      

  7.   

    Re : KcSoft(蓝色的珍珠)也就是说,不应该是你所说的“CString长度超过1000个字符肯定异常”的问题。而且,在前面我就说了,CStirng变量按程序设计,其长度在数据量增加前后是不会有变化的,他是按特定的格式保存对数据的统计信息。
      

  8.   

    我又实验了一下,将上面的测试中的
    info+="a"; 改为 info="a"; 后仍产生同样的错误。在“Statistic()”函数后执行 info="a"; 语句无误,正确显示info长度为1。
    但其后的 info+=bt; 则产生同样的错误。
      

  9.   

    用 BYTE* = new BYTE[……] 吧,永远不错。