还是关于内存分配与释放的。。。。。来者有分,谢了~

kissfall 2005-09-16 02:13:41
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申请的内存释放掉嘛,
或者该如何实现呢,
各位,请赐教?

...全文
403 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
kissfall 2005-09-19
  • 打赏
  • 举报
回复
我才发现,就是设为全局变量,只是申请了120个字节的控件,内存还是在增加,有可能用的dll库有问题,只是怀疑,另开贴询问,现在揭帖,谢了,各位,请继续支持!
kissfall 2005-09-19
  • 打赏
  • 举报
回复
char *lpd = new chaer[120] 是在一个消息处理函数中,有录音消息到达,就会执行的。
谢谢,
请大家多帮忙啊
balloy 2005-09-19
  • 打赏
  • 举报
回复
如果一个类中,char *lpd = new char[120]; 只需要执行一次,并且120这个数字固定的话,不如直接添加一个类变量 m_szBuffer[120]好了。
kissfall 2005-09-19
  • 打赏
  • 举报
回复
To: pomelowu(羽战士)
char *p = ((PWAVEHDR)dwParam1)->lpData;
ASSERT(lpdTest == p); //看看会不会断言错误。
--------------------------------------------------------------------------
没有断言错误
但是确实是这个地方泄漏
而且,我如果是用你说的这种方式来释放的话,
我停止通话的时候,会结束不掉(通话是结束了)窗口无法释放
请多帮忙,还有什么高招嘛,
谢谢了
MuseIn 2005-09-16
  • 打赏
  • 举报
回复
delete [] p;
pomelowu 2005-09-16
  • 打赏
  • 举报
回复
楼上说
1、char *pstr; 不能用delete []p

什么意思??

我也是跟鸟人想的一样,你的内存泄漏是不是其他地方引起的?
可以用鹦鹉的办法测试一下,看看是否还有这样的内存增长的情况。
或者可以用个全局变量测试一下:

char *lpdTest; //全局变量
void CVideo1::OnRecordBuf1(WPARAM wParam,LPARAM lParam)
{

char *lpd = new char[120];
lpdTest = lpd;
//...
}

void CALLBACK CVideo1::waveOutProc(HWAVEOUT hwo,UINT uMsg, DWORD dwInstance,DWORD dwParam1,DWORD dwParam2)
{
if(uMsg == WOM_DONE)
{
char *p = ((PWAVEHDR)dwParam1)->lpData;
ASSERT(lpdTest == p); //看看会不会断言错误。
if(p)
delete [] p;
((PWAVEHDR)dwParam1)->lpData = NULL;
}
}
kissfall 2005-09-16
  • 打赏
  • 举报
回复
顶一下,请高手帮忙啊!
sz_dong 2005-09-16
  • 打赏
  • 举报
回复
1、char *pstr; 不能用delete []p

2、建议用 char szBuf[120]来看看,会不会还有上述情况

3、是不是WOM_DONE消息没有发送正确? 可以加个调试语句看看,看delete 执行了多少次?
rageliu 2005-09-16
  • 打赏
  • 举报
回复
delete []p
快乐鹦鹉 2005-09-16
  • 打赏
  • 举报
回复
按道理,delete[] ((PWAVEHDR)dwParam1)->lpData;是可以释放的,但不知道你的程序是否还有其它问题阿。
kissfall 2005-09-16
  • 打赏
  • 举报
回复
确实有泄漏,
delete ((PWAVEHDR)dwParam1)->lpData;
((PWAVEHDR)dwParam1)->lpData = NULL;
这样可以满足释放内存的目的嘛请问
快乐鹦鹉 2005-09-16
  • 打赏
  • 举报
回复
回复人: kissfall(钟爱小雨) ( ) 信誉:100 2005-09-16 14:52:00 得分: 0


谢谢大家的回答,
请问,我在第一个函数中申请了内存,然后将其指向了lpdata,
在第二个函数中,可以通过
char *p = ((PWAVEHDR)dwParam1)->lpData;
if(p)
delete [] p;
p = NULL;
达到释放内存的功效,
为什么,我看我的内存还是在飙升啊
请赐教~

==在调试状态下运行后退出程序,看看是否有内存泄漏的报告,如果有,那么继续提问;如果没有,那么内存飚升就不是这个问题造成的
kissfall 2005-09-16
  • 打赏
  • 举报
回复
TV_ALaw2Linear((char*)lParam,wParam,(short *)lpd);
这个是对lpd进行赋值,
lparam传值给lpd,
然后, pWaveHdr31->lpData = (LPSTR)lpd ;
是将lpd传给lpdata,回调函数,是相应的
waveOutPrepareHeader (hWaveOut, pWaveHdr31, sizeof(WAVEHDR)) ;
waveOutWrite(hWaveOut, pWaveHdr31, sizeof(WAVEHDR)) ;

waveOutWrite结束后,自动到回调函数中,在回调函数中,可以得到的的值是pWaveHdr31->lpData,
pwavehdr31是结构体指针。
这样说,你明白了嘛,
请继续帮忙,谢谢,
快乐鹦鹉 2005-09-16
  • 打赏
  • 举报
回复
上面的方法能够删除的原因,是因为你这个lpd指针一直在进行传递阿。
快乐鹦鹉 2005-09-16
  • 打赏
  • 举报
回复
我问一下,你到底哪个函数调用了waveOutProc这个回调函数阿?从你贴出的代码看不出来。
你定义lpd = new char[120];
然后TV_ALaw2Linear((char*)lParam,wParam,(short *)lpd);
pWaveHdr31->lpData = (LPSTR)lpd ;
我看到这里lpd传递给了两个函数。到底你的回调函数响应的是哪一个?
kissfall 2005-09-16
  • 打赏
  • 举报
回复
谢谢大家的回答,
请问,我在第一个函数中申请了内存,然后将其指向了lpdata,
在第二个函数中,可以通过
char *p = ((PWAVEHDR)dwParam1)->lpData;
if(p)
delete [] p;
p = NULL;
达到释放内存的功效,
为什么,我看我的内存还是在飙升啊
请赐教~
快乐鹦鹉 2005-09-16
  • 打赏
  • 举报
回复
哦。那就照我说的办。
kissfall 2005-09-16
  • 打赏
  • 举报
回复
呵呵。我没有看清楚。羽战士是对的。
-------------------------------
这也是不行的,还是内存泄漏很严重,
并且当结束通话的时候,会提示错误,——crtisvalidheappointer(puserdata)。
什么原因啊,好诡异啊 ~~
bluestar 2005-09-16
  • 打赏
  • 举报
回复
用一个类成员变量指向分配的内存就可以了
m_ptr = new char[120];

然后可以在任意地方delete [] m_ptr了
pomelowu 2005-09-16
  • 打赏
  • 举报
回复
鸟人说得不对。听我的就好了
加载更多回复(12)

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧