内存益出!
//接收数据线程
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++);就有错,否则就能正确添加完成!
//接收数据线程
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++);就有错,否则就能正确添加完成!
pTempBuf重指向了。
已经与
pTempBuf =new INT8U[1024];
时的地址不同了
pTempBuf = (INT8U*) lparam;
你分配那么多内存,又让指针指向另一个地址,这是严重的内存泄漏.如果OnRecWavData被调用很多次,内存不足,就会有未知问题发生.另外,你的描述不清楚,你给一个指针分配内存,问题却出在另一个指针上,两个指针又似乎没什么联系.恐怕MasterZ来了也没法回答你的问题,你还是把问题说清楚再说.
pTempBuf = (INT8U*) lparam;
你分配那么多内存,又让指针指向另一个地址,这是严重的内存泄漏.如果OnRecWavData被调用很多次,内存不足,就会有未知问题发生.另外,你的描述不清楚,你给一个指针分配内存,问题却出在另一个指针上,两个指针又似乎没什么联系.恐怕MasterZ来了也没法回答你的问题,你还是把问题说清楚再说.
//接收数据线程
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之类的模板,也不建议这样跨线程使用,最好哪儿分配哪里释放。
---------------------
delete[] pTmpbufFile; ////总是蹦错
这句不能加入到可能的执行分枝里,应该放到函数最后
2)OnRecWavData是谁产生的,处理的消息是谁来产生的?
这个主要是想知道:lparam的来源,如果是系统产生的,则就不要考虑释放的问题
但:
INT8U* pTempBuf;
pTempBuf =new INT8U[1024]; ////见说明
pTempBuf = (INT8U*) lparam;
这个地方的使用,可能就有问题了,
原因是:如果lparam本身就是一个指针,那么可能在函数执行完后,系统自己删除,
那么pTempBuf指向的内容就会是一些不明确的值,
导致程序可能出现崩溃。
pTmpbufFile需要观察一下pTmpbufFile的地址是否发生改变,如果发生改变,则删除时就会出现错误。
也就是会发生pTmpbufFile使用NULL判断有时 也无能为力的错误。
pTempBuf = (INT8U*) lparam;
这边的内存已经重新指向了,删除会出问题吧。
地址指针发生改变