当前位置:首页
开发技术指南» 文章正文
    引言:

 ·高分求一分类汇总的查询    »显示摘要«
    摘要: 在一表x中有如下内容 id date txt 1 2005-09-01 a 2 2005-09-01 a 3 2005-09-01 c 4 2005-09-02 a 5 2005-09-03 b .................... 求一查询语名,要求生成一分类汇总,要求列出每日a,b,c的数量及总数 id date a b c total 1 2005-09-01 2 0 1 3......
    摘要: 如题 ......


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

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申请的内存释放掉嘛,  
  或者该如何实现呢,  
  各位,请赐教?  
   
 

NO.1   作者: happyparrot

char   *lpd   =   new   char[120];    
  将这个定义向上提。否则出了这个函数,lpd就被释放了。会造成泄漏。  
  将这个定义和空间分配放到回调函数能够访问到的类中

NO.2   作者: pomelowu

if(uMsg   ==   WOM_DONE)  
  {  
     
  char   *p   =   ((PWAVEHDR)dwParam1)->lpData;  
  if(p)  
  delete   []   p;  
  p   =   NULL;  
   
  }

NO.3   作者: xwmpq

受教了

NO.4   作者: DentistryDoctor

最好是预分配的缓冲区。

NO.5   作者: i_noname

happyparrot的担心是多余的,内存地址还记录在WAVEHDR中呢。  
   
  delete   []p;  
 

NO.6   作者: goodboyws

delete[]   p;  
  ps;   小鸟说的不对char   *lpd   =   new   char[120];   没问题

NO.7   作者: sdcer

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;  
                                      }  
   
  }  
 

NO.8   作者: zxyjyzxyjy

我认为这种方式是对的,不过分配时用new   char[120]形式,则删除时一定要用delete   []的形式。

NO.9   作者: gunney

同意楼上的   delete   []p

NO.10   作者: bluestar

用一个类成员变量指向分配的内存就可以了  
  m_ptr   =   new   char[120];    
   
  然后可以在任意地方delete   []   m_ptr了

NO.11   作者: rageliu)

delete   []p  
 

NO.12   作者: sz_dong

1、char   *pstr;   不能用delete   []p  
   
  2、建议用   char   szBuf[120]来看看,会不会还有上述情况  
   
  3、是不是WOM_DONE消息没有发送正确?   可以加个调试语句看看,看delete   执行了多少次?

NO.13   作者: MuseIn

delete   []   p;

NO.14   作者: balloy

如果一个类中,char   *lpd   =   new   char[120];   只需要执行一次,并且120这个数字固定的话,不如直接添加一个类变量   m_szBuffer[120]好了。


    摘要: 我用vc写了一个控件,在vb里调用时可以用鼠标拖控件到vb设计窗体,但是不能用createobject函数手工创建,咋回事? ......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE