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;
}
}
}
};
我想问一下,此类错误都是什么引起的。我写的程序总在运行一段后出现这个错误?
{
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;
}
}
}
};
我想问一下,此类错误都是什么引起的。我写的程序总在运行一段后出现这个错误?
bool IsLocked() const throw()
{
return nRefs < 0;
}
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).
*功能:定时召测。采用先召测地下水,在召测中水
遍历两次终端链表。中水采取召测——等待——召测。
如数据不返回,超时后,继续召测下一中水。
*参数:无
*返回值: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).
建议你把 两处
CString temp = Client->address;//这样相当于,temp指向 Client->address的内存空间。
改为
CString temp;
temp.format(Client->address); //重新分配内存,性能低一点也无谓了,很多情况下程序稳定性最重要了。
而且变量最好放在函数的前面申请,一开始就申请好需要的内存空间。随处申请随处使用是个不好的习惯。加重CPU的负担,影响程序的速度。