Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 调用堆栈中的访问冲突_C++_Visual Studio 2010_Pointers_Access Violation - Fatal编程技术网

C++ 调用堆栈中的访问冲突

C++ 调用堆栈中的访问冲突,c++,visual-studio-2010,pointers,access-violation,C++,Visual Studio 2010,Pointers,Access Violation,我得到以下错误:Cts.exe中0x003f31b5处的第一次机会异常:0xC0000005:访问冲突读取位置0xe1672514 当我使用调用堆栈时,它向这个方法吐出。 我特别评论了哪一行 当我在程序运行时单击“取消调试”时,就会发生冲突 在底部,我还包括了我的取消方法 void CInpINS::OnTimer(UINT nIDEvent) { int i,j, totalbytes; bool bfilefnd = false; CConvb Convb; CStr

我得到以下错误:Cts.exe中0x003f31b5处的第一次机会异常:0xC0000005:访问冲突读取位置0xe1672514

当我使用调用堆栈时,它向这个方法吐出。 我特别评论了哪一行

当我在程序运行时单击“取消调试”时,就会发生冲突

在底部,我还包括了我的取消方法

void CInpINS::OnTimer(UINT nIDEvent) 
{

  int i,j, totalbytes;
  bool bfilefnd = false;


  CConvb Convb;
  CString tmp;

  for (i = 0; i < (int) m_nNumMsgs; i++) {
      m_pBDF[i]->m_numrecs = m_pIDF[i]->m_numrecs;

      for (j = 0; j < MAXBYTECNT; j++) {
                OutBytes[j] = 0;
      }

        // set first 5 words 
      OutBytes[1] = m_nSelectedMsgNum[i];

      OutBytes[3] = (int)m_pIDF[i]->IDFFields[m_pIDF[i]->m_numrecs-1].ebyte/2+6; // THIS LINE SPECIFICALLY

      CConvb Convb;

      if (i == 0) m_dTimeofTransmission += m_nRate;
      tmp.Format("%20.0f",m_dTimeofTransmission);

      Convb.CONV_Timetag_to_Bytes(tmp, OutBytes[4], OutBytes[5],
                              OutBytes[6], OutBytes[7],
                              OutBytes[8], OutBytes[9],
                              OutBytes[10], OutBytes[11]);

        // start at 11 because byte 0 and 1 are input or output msg, then bytes 2 and 3 are word count
        // bytes 4 through 11 are gps time
        for (j = 0; j < m_pBDF[i]->m_numrecs; j++) {
            if ((j == 0)||(j == 1))  
            {
                Convb.ConvFld(tmp,
                    m_pIDF[i]->IDFFields[j].bbyte+9,
                    m_pIDF[i]->IDFFields[j].ebyte+9,
                    m_pIDF[i]->IDFFields[j].bbit,
                    m_pIDF[i]->IDFFields[j].ebit,
                    m_pIDF[i]->IDFFields[j].dtype,
                    m_pIDF[i]->IDFFields[j].Desc,OutBytes);

            }
            else
            {
                Convb.ConvFld(m_pBDF[i]->BDFFields[j],
                    m_pIDF[i]->IDFFields[j].bbyte+9,
                    m_pIDF[i]->IDFFields[j].ebyte+9,
                    m_pIDF[i]->IDFFields[j].bbit,
                    m_pIDF[i]->IDFFields[j].ebit,
                    m_pIDF[i]->IDFFields[j].dtype,
                    m_pIDF[i]->IDFFields[j].Desc,OutBytes);

            }
        }

        totalbytes = OutBytes[3];
        m_pDoc->sendmsg(totalbytes, false, OutBytes);
        tmp.Format("Sent Message");
        AddToListBox(tmp);
        UpdateData(false);
        m_nNumSent +=1;

}

}
void CInpINS::OnTimer(UINT nIDEvent)
{
int i,j,总字节数;
bool bfilefnd=false;
CConvb Convb;
CString-tmp;
对于(i=0;i<(int)m_nNumMsgs;i++){
m_-pBDF[i]->m_-numrecs=m_-pIDF[i]->m_-numrecs;
对于(j=0;jIDFFields[m_-pIDF[i]->m_-numrecs-1].ebyte/2+6;//这一行特别
CConvb Convb;
如果(i==0)m_dTimeofTransmission+=m_nRate;
tmp.格式(“%20.0f”,m_dTimeofTransmission);
Convb.CONV_Timetag_to_Bytes(tmp,OutBytes[4],OutBytes[5],
OutBytes[6],OutBytes[7],
OutBytes[8],OutBytes[9],
OutBytes[10],OutBytes[11]);
//从11开始,因为字节0和1是输入或输出消息,所以字节2和3是字数
//字节4到11是gps时间
对于(j=0;jm_-numrecs;j++){
如果((j==0)| |(j==1))
{
Convb.ConvFld(tmp,
m_pIDF[i]->IDFFields[j].bbyte+9,
m_pIDF[i]->IDFFields[j].ebyte+9,
m_pIDF[i]->IDFFields[j].bbit,
m_pIDF[i]>IDFFields[j].息税前利润,
m_pIDF[i]->IDFFields[j].dtype,
m_pIDF[i]->IDFFields[j].Desc,OutBytes);
}
其他的
{
Convb.ConvFld(m_pBDF[i]>BDFFields[j],
m_pIDF[i]->IDFFields[j].bbyte+9,
m_pIDF[i]->IDFFields[j].ebyte+9,
m_pIDF[i]->IDFFields[j].bbit,
m_pIDF[i]>IDFFields[j].息税前利润,
m_pIDF[i]->IDFFields[j].dtype,
m_pIDF[i]->IDFFields[j].Desc,OutBytes);
}
}
totalbytes=OutBytes[3];
m_pDoc->sendmsg(totalbytes、false、OutBytes);
tmp.格式(“发送消息”);
AddToListBox(tmp);
更新数据(假);
m_nNumSent+=1;
}
}
以下是取消方法:

void CInpINS::OnCancel() 
    {
if (m_bSetIDF) 
{
    for (int i = 0; i < (int) m_nNumMsgs; i++) {
        delete m_pIDF[i];
        delete m_pIDFCustm[i];
        delete m_pBDF[i];   
    }
    m_bSetIDF = false;
}

AfxGetMainWnd()->PostMessage(WM_GOODBYEINPINS, IDOK);

CDialog::OnCancel();

}
void CInpINS::OnCancel()
{
如果(m_bSetIDF)
{
对于(int i=0;i<(int)m_nNumMsgs;i++){
删除m_pIDF[i];
删除m_pIDFCustm[i];
删除m_pBDF[i];
}
m_bSetIDF=假;
}
AfxGetMainWnd()->PostMessage(WM_GOODBYEINPINS,IDOK);
CDialog::OnCancel();
}

这是用C++ Visual Studio 2010编码的。我想可能有一些空指针或其他东西,但我不确定。任何帮助都将不胜感激。谢谢。

您的
OnCancel
正在取消分配内存,而不确保
OnTimer
仍在访问该内存


在删除变量之前,确保调用
KillTimer
(并确保
OnTimer
已完成)。

可能
m_pIDF[i]->m_numrecs-1
超出
IDFFields
数组的范围。当变量进入调试器时,请查看它。这里可能会发生很多事情<代码>此可能无效
i
m_pIDF[i]->m_numrecs-1
可能超出范围。位于
m_pIDF[i]
的指针可能悬空或未初始化。程序中其他地方的小精灵可能已经打破了这一局面。我想我们需要一个程序来帮助解决这个问题。但是除了访问冲突之外,这不会给我一个不同的错误吗?由于
c++
不一定需要检查边界。在通过
delete
ing内存从下面拉出众所周知的地毯之前,您是否停止计时器(并确保计时器程序已退出)?您的代码可能正在使用
SetTimer
在某处创建计时器,并希望存储返回的ID。在开始删除内存之前,需要将其传递到
KillTimer
以停止计时器。然后您需要一些方法来确保
OnTimer
在实际的
delete
s之前退出。