void CVideo1::OnRecordBuf1(WPARAM wParam,LPARAM lParam)
{
//为声音的线性转换申请空间。------这是实时分配的内存。。。。。。。。
char *lpd = new char[120];
//ALAW转化为线性声音
memset(lpd,0,120);
TV_ALaw2Linear((char*)lParam,wParam,(short *)lpd);
pWaveHdr31->lpData = (LPSTR)lpd ;
pWaveHdr31->dwBufferLength = 2*wParam ;
pWaveHdr31->dwBytesRecorded = 0 ;
pWaveHdr31->dwUser = 0 ;
pWaveHdr31->dwFlags = 0;
pWaveHdr31->dwLoops = 0;
// 准备头写声卡
waveOutPrepareHeader (hWaveOut, pWaveHdr31, sizeof(WAVEHDR)) ;
waveOutWrite(hWaveOut, pWaveHdr31, sizeof(WAVEHDR)) ;
}
然后在播放完毕,会在回调函数中得到完成的消息,然后我想把lpd指向的内存给释放掉,
void CALLBACK CVideo1::waveOutProc(HWAVEOUT hwo,UINT uMsg, DWORD dwInstance,DWORD dwParam1,DWORD dwParam2)
{
if(uMsg == WOM_DONE)
{
char *p = ((PWAVEHDR)dwParam1)->lpData;
delete p;
p = NULL;
}
}
请问这样可以将用lpd申请的内存释放掉嘛,
或者该如何实现呢,
各位,请赐教?
char *lpd = new char[120];
将这个定义向上提。否则出了这个函数,lpd就被释放了。会造成泄漏。
将这个定义和空间分配放到回调函数能够访问到的类中
if(uMsg == WOM_DONE)
{
char *p = ((PWAVEHDR)dwParam1)->lpData;
if(p)
delete [] p;
p = NULL;
}
受教了
最好是预分配的缓冲区。
happyparrot的担心是多余的,内存地址还记录在WAVEHDR中呢。
delete []p;
delete[] p;
ps; 小鸟说的不对char *lpd = new char[120]; 没问题
char *lpd = NULL;
void CVideo1::OnRecordBuf1(WPARAM wParam,LPARAM lParam)
{
//为声音的线性转换申请空间。------这是实时分配的内存。。。。。。。。
lpd = new char[120];
}
lpd的声明,必须能够让你的回调函数可见才行,而为其分配空间,则可以放在全局的范围内,也可以放在函数内,但lpd必须被回调函数可见。
if(uMsg == WOM_DONE)
{
char *p = ((PWAVEHDR)dwParam1)->lpData;
if(p)
{
delete [] p;
p = NULL;
}
}
我认为这种方式是对的,不过分配时用new char[120]形式,则删除时一定要用delete []的形式。
同意楼上的 delete []p
用一个类成员变量指向分配的内存就可以了
m_ptr = new char[120];
然后可以在任意地方delete [] m_ptr了
delete []p
1、char *pstr; 不能用delete []p
2、建议用 char szBuf[120]来看看,会不会还有上述情况
3、是不是WOM_DONE消息没有发送正确? 可以加个调试语句看看,看delete 执行了多少次?
delete [] p;
如果一个类中,char *lpd = new char[120]; 只需要执行一次,并且120这个数字固定的话,不如直接添加一个类变量 m_szBuffer[120]好了。