内存益出! 
 
//接收数据线程
LRESULT CLZReaTimeDlg::OnRecWavData(UINT nID, LPARAM lparam)
{
      INT8U* pTempBuf;
     pTempBuf =new INT8U[1024];    ////见说明
    pTempBuf = (INT8U*) lparam;
........
   if (nBlockSeq==0)
    {    
        if (pTmpbufFile!=NULL) 
        {
            delete[] pTmpbufFile; ////总是蹦错
            pTmpbufFile=NULL;        
        }
        pTmpbufFile =new INT8U[nFileLen];
    }
}
......
    for (int j=11;j<nSizeBuf;j++)
    {
      //     pTmpbufFile[j+lTemp] = pTempBuf[11+j];
        pTmpbufFile[j+lTemp] = pTempBuf[j];
        m_Progress.SetPos(j+lTemp);
    }m_DBOperator.InsertRecWavData(struct_RecWavData.strRecWavTime,struct_RecWavData.nActiveType,pTmpbufFile,struct_RecWavData.strEquipmentName,nFileLen);//将保存到数据库中
这个函数中 InsertRecWavData有对
for (int i=0;i<nFileLen;i++) 
      {
           byteArry.Add(*pTmpBuf++);
       }说明,如果 pTempBuf =new INT8U[1024];    去掉, byteArry.Add(*pTmpBuf++);就有错,否则就能正确添加完成!

解决方案 »

  1.   

    pTempBuf   =   (INT8U*)   lparam;--
    pTempBuf重指向了。
    已经与
    pTempBuf   =new   INT8U[1024];
    时的地址不同了
      

  2.   

    要弄清楚lparam到底是什么东西,能不能支持类似byteArry.Add(*pTmpBuf++);的操作
      

  3.   

    pTempBuf   =new   INT8U[1024];         ////见说明 
    pTempBuf   =   (INT8U*)   lparam; 
    你分配那么多内存,又让指针指向另一个地址,这是严重的内存泄漏.如果OnRecWavData被调用很多次,内存不足,就会有未知问题发生.另外,你的描述不清楚,你给一个指针分配内存,问题却出在另一个指针上,两个指针又似乎没什么联系.恐怕MasterZ来了也没法回答你的问题,你还是把问题说清楚再说.
      

  4.   

    pTempBuf   =new   INT8U[1024];         ////见说明 
    pTempBuf   =   (INT8U*)   lparam; 
    你分配那么多内存,又让指针指向另一个地址,这是严重的内存泄漏.如果OnRecWavData被调用很多次,内存不足,就会有未知问题发生.另外,你的描述不清楚,你给一个指针分配内存,问题却出在另一个指针上,两个指针又似乎没什么联系.恐怕MasterZ来了也没法回答你的问题,你还是把问题说清楚再说.
      

  5.   

    内存益出!   
      
    //接收数据线程 
    LRESULT   CLZReaTimeDlg::OnRecWavData(UINT   nID,   LPARAM   lparam) 

                INT8U*   pTempBuf; 
              pTempBuf   =new   INT8U[1024];         ////见说明 
            pTempBuf   =   (INT8U*)   lparam; 
    ........ 
          if   (nBlockSeq==0) 
            {
                    if   (pTmpbufFile!=NULL)   
                    { 
                            delete[]   pTmpbufFile; ////总是蹦错 
                            pTmpbufFile=NULL;                 
                    } 
                    pTmpbufFile   =new   INT8U[nFileLen]; 
            } 
    // 下面的语句是哪里的?
    ...... 
            for   (int   j=11;j <nSizeBuf;j++) 
            { 
                //           pTmpbufFile[j+lTemp]   =   pTempBuf[11+j]; 
                    pTmpbufFile[j+lTemp]   =   pTempBuf[j]; 
                    m_Progress.SetPos(j+lTemp); 
            } m_DBOperator.InsertRecWavData(struct_RecWavData.strRecWavTime,struct_RecWavData.nActiveType,pTmpbufFile,struct_RecWavData.strEquipmentName,nFileLen);//将保存到数据库中 
    这个函数中 InsertRecWavData有对 
    for   (int   i=0;i <nFileLen;i++)   
                { 
                          byteArry.Add(*pTmpBuf++); 
                  } 说明,如果   pTempBuf   =new   INT8U[1024];         去掉,   byteArry.Add(*pTmpBuf++);就有错,否则就能正确添加完成!LZ 好好看看你自己贴的程序!既然请教别人,为什么不认真的把问题“讲”清楚呢?lParam 是什么参数?如果是动态分配的,(new, delete); (new[], delete[])一定要用对!另外如果是STL之类的模板,也不建议这样跨线程使用,最好哪儿分配哪里释放。
      

  6.   

    上面说得都对,
    ---------------------
    delete[]       pTmpbufFile; ////总是蹦错  
    这句不能加入到可能的执行分枝里,应该放到函数最后
      

  7.   

    1)pTmpbuffile的定义没有看到,所以没有办法断定程序错误在哪里?
    2)OnRecWavData是谁产生的,处理的消息是谁来产生的?
    这个主要是想知道:lparam的来源,如果是系统产生的,则就不要考虑释放的问题
    但:
    INT8U*   pTempBuf; 
    pTempBuf   =new   INT8U[1024];         ////见说明 
    pTempBuf   =   (INT8U*)   lparam; 
    这个地方的使用,可能就有问题了,
    原因是:如果lparam本身就是一个指针,那么可能在函数执行完后,系统自己删除,
    那么pTempBuf指向的内容就会是一些不明确的值,
    导致程序可能出现崩溃。
    pTmpbufFile需要观察一下pTmpbufFile的地址是否发生改变,如果发生改变,则删除时就会出现错误。
    也就是会发生pTmpbufFile使用NULL判断有时 也无能为力的错误。
      

  8.   

    pTempBuf   =new   INT8U[1024];         ////见说明 
    pTempBuf   =   (INT8U*)   lparam; 
    这边的内存已经重新指向了,删除会出问题吧。
      

  9.   

    byteArry.Add(*pTmpBuf++); 
    地址指针发生改变