我现在的Cpp文件如下:
#include "stdafx.h" BOOL  ReadWaveFile(LPCTSTR lpszFileName, MMCKINFO* lpMmck, WAVEFORMATEX* lpWaveFormatEx, 
                                                              HPSTR* ppData, DWORD* lpDataLength);
BOOL  WriteWaveFile(LPCTSTR lpszFileName, MMCKINFO* lpMmck, WAVEFORMATEX* lpWaveFormatEx,
                                                              HPSTR* ppData, DWORD* lpDataLength);
BOOL  BindWaveData(HPSTR* ppData_Left, HPSTR* ppData_Right, HPSTR* ppData_BindCh, DWORD* lpDataLength);int _tmain(int argc, _TCHAR* argv[])
{
HPSTR*  ppData_L = new HPSTR;
HPSTR*  ppData_R = new HPSTR;
HPSTR*  ppData_Bind = new HPSTR; DWORD* lpDataLength_L = new DWORD;
DWORD* lpDataLength_R = new DWORD;
DWORD* lpDataLength_Bind = new DWORD; WAVEFORMATEX* lpWaveFormatEx_L = new WAVEFORMATEX;
WAVEFORMATEX* lpWaveFormatEx_R = new WAVEFORMATEX;
WAVEFORMATEX* lpWaveFormatEx_Bind = new WAVEFORMATEX; MMCKINFO*    lpMmck_L = new MMCKINFO[2];
MMCKINFO*    lpMmck_R = new MMCKINFO[2];
MMCKINFO*    lpMmck_Bind = new MMCKINFO[2]; ReadWaveFile("E:\\try\\x1.wav", lpMmck_L, lpWaveFormatEx_L, ppData_L, lpDataLength_L );
ReadWaveFile("E:\\try\\x2.wav", lpMmck_R, lpWaveFormatEx_R, ppData_R, lpDataLength_R ); *lpDataLength_Bind = (*lpDataLength_L)*2; memcpy(lpWaveFormatEx_Bind, lpWaveFormatEx_L, sizeof(WAVEFORMATEX));
(*lpWaveFormatEx_Bind).nChannels=2; memcpy(lpMmck_Bind, lpMmck_L, sizeof(MMCKINFO[2]));
lpMmck_Bind[1].cksize = (lpMmck_L[1].cksize)*2;
lpMmck_Bind[0].cksize = lpMmck_Bind[1].cksize+38; BindWaveData(ppData_L, ppData_R, ppData_Bind, lpDataLength_Bind);
WriteWaveFile("E:\\try\\x.wav", lpMmck_Bind, lpWaveFormatEx_Bind, ppData_Bind, lpDataLength_Bind ); delete[] lpMmck_L;
delete[] lpMmck_R;
delete[] lpMmck_Bind; delete lpWaveFormatEx_L;
delete lpWaveFormatEx_R;
delete lpWaveFormatEx_Bind; delete[] ppData_L;
delete[] ppData_R;
delete[] ppData_Bind; delete ppData_L;
delete ppData_R;
delete ppData_Bind; delete lpDataLength_L;
delete lpDataLength_R;
delete lpDataLength_Bind; return 0;
}BOOL ReadWaveFile(LPCTSTR lpszFileName, MMCKINFO* lpMmck, WAVEFORMATEX*  lpWaveFormatEx, 
  HPSTR*  ppData, DWORD* lpDataLength )
{
   HMMIO          hmmio;   if(!(hmmio = mmioOpen((LPSTR)lpszFileName, NULL, 
MMIO_READ | MMIO_ALLOCBUF)))
   {
return FALSE;
   }
   lpMmck[0].fccType = mmioFOURCC('W', 'A', 'V', 'E');
   if (mmioDescend(hmmio, &lpMmck[0], NULL, MMIO_FINDRIFF))
   {
mmioClose(hmmio, 0);
return FALSE;
   }
   lpMmck[1].ckid = mmioFOURCC('f', 'm', 't', ' ');
   if (mmioDescend(hmmio, &lpMmck[1], &lpMmck[0],
   MMIO_FINDCHUNK))
   {
mmioClose(hmmio, 0);
return FALSE;
   }
   long mmio1=mmioRead(hmmio, (HPSTR)lpWaveFormatEx, sizeof(WAVEFORMATEX));
   if ( mmio1
!= (LONG) sizeof(WAVEFORMATEX))
   {
mmioClose(hmmio, 0);
return FALSE;
   }
   if ((*lpWaveFormatEx).wFormatTag != WAVE_FORMAT_PCM)
   {
mmioClose(hmmio, 0);
return FALSE;
   }
   mmioAscend(hmmio, &lpMmck[1], 0);
   lpMmck[1].ckid = mmioFOURCC('d', 'a', 't', 'a');
   if (mmioDescend(hmmio, &lpMmck[1], &lpMmck[0],
MMIO_FINDCHUNK))
   {
mmioClose(hmmio, 0);
return FALSE;
   }
   *lpDataLength = lpMmck[1].cksize;
   if ((*lpDataLength) == 0L)
   {
mmioClose(hmmio, 0);
return FALSE;
   }
   delete[] *ppData;
   *ppData = new char[*lpDataLength];
   if (!(*ppData))
   {
mmioClose(hmmio, 0);
return FALSE;
   }
   unsigned long mmio=mmioRead(hmmio, *ppData, *lpDataLength);
   if( mmio!= (LONG) (*lpDataLength))
   {
mmioClose(hmmio, 0);
return FALSE;
   }
   mmioClose(hmmio, 0);
   return TRUE;
}BOOL WriteWaveFile(LPCTSTR lpszFileName, MMCKINFO* lpMmck, WAVEFORMATEX*  lpWaveFormatEx,
   HPSTR* ppData, DWORD* lpDataLength)
{
   HMMIO          hmmio;   if(!(hmmio = mmioOpen((LPSTR)lpszFileName, NULL, 
MMIO_CREATE | MMIO_WRITE | MMIO_ALLOCBUF)))
   {
return FALSE;
   }
lpMmck[0].fccType = mmioFOURCC('W', 'A', 'V', 'E');
if (MMSYSERR_NOERROR != 
mmioCreateChunk(hmmio, &lpMmck[0], MMIO_CREATERIFF))
{
mmioClose(hmmio, 0);
return FALSE;
}
lpMmck[1].ckid = mmioFOURCC('f', 'm', 't', ' ');
lpMmck[1].cksize = sizeof(*lpWaveFormatEx); 
if (MMSYSERR_NOERROR != 
mmioCreateChunk(hmmio, &lpMmck[1], 0))
{
mmioClose(hmmio, 0);
return FALSE;
}
if (mmioWrite(hmmio, (HPSTR) lpWaveFormatEx, sizeof(*lpWaveFormatEx))
!= sizeof(*lpWaveFormatEx))
{
mmioClose(hmmio, 0);
return FALSE;
}
if (MMSYSERR_NOERROR != mmioAscend(hmmio, &lpMmck[1], 0))
{
mmioClose(hmmio, 0);
return FALSE;
}
lpMmck[1].ckid = mmioFOURCC('d', 'a', 't', 'a');
if (MMSYSERR_NOERROR != mmioCreateChunk(hmmio, &lpMmck[1], 0))
{
mmioClose(hmmio, 0);
return FALSE;
}
if (mmioWrite(hmmio, *ppData, *lpDataLength) != (LONG)(*lpDataLength))
{
mmioClose(hmmio, 0);
return FALSE;
}
if (MMSYSERR_NOERROR != mmioAscend(hmmio, &lpMmck[1], 0))
{
mmioClose(hmmio, 0);
return FALSE;
}
    lpMmck[0].cksize=(*lpDataLength) + sizeof(WAVEFORMATEX);
if (MMSYSERR_NOERROR != 
mmioAscend(hmmio, &lpMmck[0], 0))
{
mmioClose(hmmio, 0);
return FALSE;
}
mmioClose(hmmio, 0); return TRUE;
}BOOL BindWaveData(HPSTR* ppData_Left, HPSTR* ppData_Right, HPSTR* ppData_BindCh, DWORD* lpDataLength)
{
int i, SofSHORT;
DWORD dwDataLength = (*lpDataLength)/2; SofSHORT = sizeof(SHORT);
*ppData_BindCh = new char[*lpDataLength];
for(i=0; i<dwDataLength;i += SofSHORT)
{
*(SHORT*)((*ppData_BindCh)+2*i) = *(SHORT*)((*ppData_Left)+i);
*(SHORT*)((*ppData_BindCh)+2*i+SofSHORT) = *(SHORT*)((*ppData_Right)+i);
}
return 0;
}Stdafx.h:
#pragma once
#include <iostream>
#include <tchar.h>
#include <memory.h>
#include <windows.h>
#include <windowsx.h>
#include <mmsystem.h>
#pragma comment (lib, "winmm.lib")以上程序可以将两个单声道Wav文件合成为一个双声道Wav文件。在完成以上任务后,我进一步将Cpp文件规范化如上。但是在调试时,总是指示Free.c文件出错或是定义new的那个C文件中某一地方出错。如果将所有Delete语句删除编译就很正常。这是什么原因?

解决方案 »

  1.   

    错误出现的具体位置:
    delete lpDataLength_L;
    delete lpDataLength_R;
    delete lpDataLength_Bind;
    这三项只能delete一项。如果同时delete两项以上,就会报告free.c的void __cdecl _free_base (void * pBlock)函数中的HeapFree(_crtheap, 0, pBlock)出错。冲突发生在反汇编语句“004019A7 pop esi”。
    我用的是Visual Studio .net 2003。
      

  2.   

    我知道错误在什么地方了!错在我对ppData这个指向指针的指针释放方式错误:将
    delete[] ppData_L;
    delete[] ppData_R;
    delete[] ppData_Bind;delete ppData_L;
    delete ppData_R;
    delete ppData_Bind;
    改为
    delete[] *ppData_L;
    delete[] *ppData_R;
    delete[] *ppData_Bind; *ppData_L=NULL;
    *ppData_R=NULL;
    *ppData_Bind=NULL; delete ppData_L;
    delete ppData_R;
    delete ppData_Bind;
    就会一切正常。
      

  3.   

    向楼主学习,不过还有个问题不清楚,就是lpMmck_L、lpMmck_R 、lpMmck_Bind 的delete怎么就可以,其结构和ppData_L;ppData_R;ppData_Bind;类似呀!
      

  4.   

    lpMmck_L、lpMmck_R 、lpMmck_Bind是指向结构的指针(指向struct MMCKINFO)。ppData_L、ppData_R、ppData_Bind是指向HPSTR的指针,HPSTR在微软的定义中是char _huge*,是指向巨模式的字节数组的指针,因此是指向指针的指针。两种指针的释放方式应该有所区别吧!我也是初学,有些东西也不清楚。不过我的错误,是因为将ppData_L、ppData_R、ppData_Bind反复Delete,造成了后面的指针Delete错误,导致lpDataLength只能删除一项;而又遗忘了Delete掉*ppData_L、*ppData_R、*ppData_Bind,造成了内存泄漏。