struct CStringData
{
IAtlStringMgr* pStringMgr;  // String manager for this CStringData
int nDataLength;  // Length of currently used data in XCHARs (not including terminating null)
int nAllocLength;  // Length of allocated data in XCHARs (not including terminating null)
long nRefs;     // Reference count: negative == locked
// XCHAR data[nAllocLength+1]  // A CStringData is always followed in memory by the actual array of character data void* data() throw()
{
return (this+1);
} void AddRef() throw()
{
ATLASSERT(nRefs > 0);
_AtlInterlockedIncrement(&nRefs);
}
bool IsLocked() const throw()
{
return nRefs < 0;
}
bool IsShared() const throw()
{
return( nRefs > 1 );  //在这出现错误
}
void Lock() throw()
{
ATLASSERT( nRefs <= 1 );
nRefs--;  // Locked buffers can't be shared, so no interlocked operation necessary
if( nRefs == 0 )
{
nRefs = -1;
}
}
void Release() throw()
{
ATLASSERT( nRefs != 0 ); if( _AtlInterlockedDecrement( &nRefs ) <= 0 )
{
pStringMgr->Free( this );
}
}
void Unlock() throw()
{
ATLASSERT( IsLocked() ); if(IsLocked())
{
nRefs++;  // Locked buffers can't be shared, so no interlocked operation necessary
if( nRefs == 0 )
{
nRefs = 1;
}
}
}
};
我想问一下,此类错误都是什么引起的。我写的程序总在运行一段后出现这个错误?

解决方案 »

  1.   

    我估计你某些地方有内存访问越界,破坏了这个对象,因此当你访问其成员变量时,this指针指向了非法的位置
      

  2.   

    抱歉各位大侠,我一时疏忽了。错误的位置在
    bool IsLocked() const throw() 

    return nRefs < 0; 
      

  3.   

    一般时候不怎么用CString了。
      

  4.   

    你查看一下,你声明CString变量的位置的附近的数组变量的使用,应该是它们越界了,造成你这个CString变量自己的内存错误
      

  5.   

    CString本身有内存管理,不大可能出现内存问题,而应该是你程序的其他地方内存出了问题。
      

  6.   

    正在用boundschecker调试,出现
    Loaded 'C:\Program Files\Common Files\System\ado\msadrh15.dll', no matching symbolic information found.
    First-chance exception in Server.exe (KERNEL32.DLL): 0xC0000005: Access Violation.
    The thread 0x1398 has exited with code 0 (0x0).
      

  7.   

    /****************************************************
    *功能:定时召测。采用先召测地下水,在召测中水
           遍历两次终端链表。中水采取召测——等待——召测。
           如数据不返回,超时后,继续召测下一中水。
    *参数:无
    *返回值:void
    ******************************************************/void IOCP::BroadcastCall()
    {
    //Sleep(1);

    EnterCriticalSection(&g_csClientList);
    std::vector <ClientContext *>::iterator IterClientContext;
    for (IterClientContext = g_ClientContext.begin(); IterClientContext != g_ClientContext.end();)
    {
    ClientContext * Client=*IterClientContext;
    if (Client->m_GprsProtocol==GF)                 //地下水召测
    {
    if (Client->SendEnble==TRUE)
    {
    Client->SendEnble=FALSE;
    CString temp=Client->address;
    int len=strlen(temp);
    for(int i=6;i-len>0;i--)
    {
    temp="0"+temp;
    }
    unsigned char sendDatad[15];
    memset(sendDatad,0,sizeof(sendDatad));
    sendDatad[0]=0x68;
    sendDatad[1]=0x08;
    sendDatad[2]=0x08;
    sendDatad[3]=0x68;
    sendDatad[4]=0x10;
    sendDatad[5]=0x00;
    sendDatad[6]=0x00;
    int dd=0x00;
    sscanf((const char *)(LPCTSTR)temp.Mid(0,2), "%x", &dd);sendDatad[7]=dd;
    int dd1=0x00;
    sscanf((const char *)(LPCTSTR)temp.Mid(2,2), "%x", &dd1);sendDatad[8]=dd1;
    int dd2=0x00;
    sscanf((const char *)(LPCTSTR)temp.Mid(4,2), "%x", &dd2);sendDatad[9]=dd2;
    sendDatad[10]=0x40;
    sendDatad[11]=0xE7;

    unsigned char sum=0x00;
    for (int j=4;j<12;j++)
    sum=sum+sendDatad[j]; //校验和

    sendDatad[12]=sum;
    sendDatad[13]=0x16;

    Client->Send((char *)sendDatad,14);
    }
    }
    IterClientContext++;
    }
    std::vector <ClientContext *>::iterator IterCCt;
    for(IterCCt = g_ClientContext.begin(); IterCCt != g_ClientContext.end();)
    {
    ClientContext * Client=*IterCCt;
    if(Client->m_GprsProtocol==PS)                       // 中水召测
    {
    CString clientphone=Client->phoneNumber;
    clientphone=clientphone+"0";

    int n=0;
    while(n<Client->watch_num)
    {
    if(Client->SendEnble==TRUE)
    {
    Client->SendEnble=FALSE;
    unsigned char SecondData[31];
    memset(SecondData,0,sizeof(SecondData));
    SecondData[0]=0x12;
    SecondData[1]=0x34;
    SecondData[2]=0x56;
    SecondData[3]=0x00;
    SecondData[4]=0x1E;
    SecondData[5]=0x80;
    SecondData[6]=0x01;
    SecondData[7]=0x0B;
    SecondData[8]=0x00;
    SecondData[9]=0x00;
    SecondData[10]=0x00;
    SecondData[11]=0x00;
    SecondData[12]=0x00;
    SecondData[13]=0x10;
    SecondData[14]=0x0B;
    int d0=0x00;
    sscanf_s((const char *)(LPCTSTR)clientphone.Mid(0,2), "%x", &d0);
    SecondData[15]=d0;
    int d1=0x00;
    sscanf_s((const char *)(LPCTSTR)clientphone.Mid(2,2), "%x", &d1);
    SecondData[16]=d1;
    int d2=0x00;
    sscanf_s((const char *)(LPCTSTR)clientphone.Mid(4,2), "%x", &d2);
    SecondData[17]=d2;
    int d3=0x00;
    sscanf_s((const char *)(LPCTSTR)clientphone.Mid(6,2), "%x", &d3);
    SecondData[18]=d3;
    int d4=0x00;
    sscanf_s((const char *)(LPCTSTR)clientphone.Mid(8,2), "%x", &d4);
    SecondData[19]=d4;
    int d5=0x00;
    sscanf_s((const char *)(LPCTSTR)clientphone.Mid(10,2),"%x", &d5);
    SecondData[20]=d5;
    SecondData[21]=0x65;
    SecondData[22]=0x04;
    SecondData[23]=0x13;

    switch(Client->wells[n].protocol)
    {
    case 1:
    SecondData[24]=0xB4;    //表1
    break;
    case 2:
    SecondData[24]=0xB8;    //表2
    break;
    case 3:
    SecondData[24]=0xBC;    //表3
    break;
    case 4:
    SecondData[24]=0xC0;    //表4
    break;
    default:break;
    }
    SecondData[25]=0x00;
    SecondData[26]=0x04;

    byte high=0x00;
    byte low=0x00;
    byte hexyihuo=0x00;
    unsigned char crcdata[6];
    memset(crcdata,0,sizeof(crcdata));
    crcdata[0]=0x65;
    crcdata[1]=0x04;
    crcdata[2]=0x13;
    crcdata[3]=SecondData[24];
    crcdata[4]=0x00;
    crcdata[5]=0x04;
    CRC_Check(crcdata,6,high,low);   //求CRC校验
    SecondData[27]=high;
    SecondData[28]=low;
    hexyihuo=SecondData[0]^SecondData[1]^SecondData[2]^
    SecondData[3]^SecondData[4]^SecondData[5]^SecondData[6]^
    SecondData[7]^SecondData[8]^SecondData[9]^SecondData[10]^
    SecondData[11]^SecondData[12]^SecondData[13]^SecondData[14]^
    SecondData[15]^SecondData[16]^SecondData[17]^SecondData[18]^SecondData[19]^
    SecondData[20]^SecondData[21]^SecondData[22]^SecondData[23]^
    SecondData[24]^SecondData[25]^SecondData[26]^SecondData[27]^
    SecondData[28];
    SecondData[29]=hexyihuo;
    Client->Send((char *)SecondData,30);      //召测二次表

    Client->Active_Num=n;     //当前活跃的二次表

    Sleep(5000);              //等待5秒

    if(Client->SendEnble==TRUE)
    {
    Client->SendEnble=FALSE;
    unsigned char SecondDatat[31];
    memset(SecondDatat,0,sizeof(SecondDatat));
    SecondDatat[0]=0x12;
    SecondDatat[1]=0x34;
    SecondDatat[2]=0x56;
    SecondDatat[3]=0x00;
    SecondDatat[4]=0x1E;
    SecondDatat[5]=0x80;
    SecondDatat[6]=0x01;
    SecondDatat[7]=0x0B;
    SecondDatat[8]=0x00;
    SecondDatat[9]=0x00;
    SecondDatat[10]=0x00;
    SecondDatat[11]=0x00;
    SecondDatat[12]=0x00;
    SecondDatat[13]=0x10;
    SecondDatat[14]=0x0B;
    int  tt=0x00;
    sscanf_s((const char *)(LPCTSTR)clientphone.Mid(0,2), "%x", &tt);
    SecondDatat[15]=tt;
    int  tt1=0x00;
    sscanf_s((const char *)(LPCTSTR)clientphone.Mid(2,2), "%x", &tt1);
    SecondDatat[16]=tt1;
    int  tt2=0x00;
    sscanf_s((const char *)(LPCTSTR)clientphone.Mid(4,2), "%x", &tt2);
    SecondDatat[17]=tt2;
    int  tt3=0x00;
    sscanf_s((const char *)(LPCTSTR)clientphone.Mid(6,2), "%x", &tt3);
    SecondDatat[18]=tt3;
    int  tt4=0x00;
    sscanf_s((const char *)(LPCTSTR)clientphone.Mid(8,2), "%x", &tt4);
    SecondDatat[19]=tt4;
    int  tt5=0x00;
    sscanf_s((const char *)(LPCTSTR)clientphone.Mid(10,2),"%x", &tt5);
    SecondDatat[20]=tt5;
    SecondDatat[21]=0x65;
    SecondDatat[22]=0x02;
    SecondDatat[23]=0x13;
    SecondDatat[24]=0x88;
    SecondDatat[25]=0x00;
    SecondDatat[26]=0x2B;
    SecondDatat[27]=0xB4;
    SecondDatat[28]=0x9F;
    hexyihuo=SecondDatat[0]^SecondDatat[1]^SecondDatat[2]^
    SecondDatat[3]^SecondDatat[4]^SecondDatat[5]^SecondDatat[6]^
    SecondDatat[7]^SecondDatat[8]^SecondDatat[9]^SecondDatat[10]^
    SecondDatat[11]^SecondDatat[12]^SecondDatat[13]^SecondDatat[14]^
    SecondDatat[15]^SecondDatat[16]^SecondDatat[17]^SecondDatat[18]^SecondDatat[19]^
    SecondDatat[20]^SecondDatat[21]^SecondDatat[22]^SecondDatat[23]^
    SecondDatat[24]^SecondDatat[25]^SecondDatat[26]^SecondDatat[27]^
    SecondDatat[28];
    SecondDatat[29]=hexyihuo;
    Client->Send((char *)SecondDatat,30);      //召测二次表
    Sleep(5000);
    }
    Client->SendEnble=TRUE;
    }
    n++;           //依次召测二次表
    }
    }
    IterCCt++;
    }
    LeaveCriticalSection(&g_csClientList);
    }
    从输出看应该是这段代码有问题,程序每隔一段时间执行这个函数一次。但不知道那里错了,
    The thread 0x1398 has exited with code 0 (0x0).
    The thread 0x1458 has exited with code 0 (0x0).
    The thread 0x11D4 has exited with code 0 (0x0).
    First-chance exception in IOCPServer.exe (KERNEL32.DLL): 0xC0000005: Access Violation.
    First-chance exception in IOCPServer.exe (KERNEL32.DLL): 0xC0000005: Access Violation.
    First-chance exception in IOCPServer.exe (KERNEL32.DLL): 0xC0000005: Access Violation.
    First-chance exception in IOCPServer.exe (KERNEL32.DLL): 0xC0000005: Access Violation.
    The thread 0x135C has exited with code 0 (0x0).
      

  8.   

    boundschecker需要设置一下,让他检测数组越界什么的,默认不检测的
      

  9.   

    用debug模式跑一把,挂的时候看一下调用栈,看看在你的代码的哪一句挂了。
      

  10.   

    VC Debug模式应该能够找到哪一步出错啊!
    建议你把 两处
    CString temp = Client->address;//这样相当于,temp指向 Client->address的内存空间。
    改为 
    CString temp;
    temp.format(Client->address); //重新分配内存,性能低一点也无谓了,很多情况下程序稳定性最重要了。
    而且变量最好放在函数的前面申请,一开始就申请好需要的内存空间。随处申请随处使用是个不好的习惯。加重CPU的负担,影响程序的速度。