关于内存不足的有关问题

关于内存不足的问题
void CEditAViView::OnNFrame() //从一个AVI视频中提取某一帧图像
{
// TODO: Add your command handler code here
CNFrameNum numdlg; //一个对话框累
  CEditAViDoc* pDoc = GetDocument();  
AVIHandler *pAviHandler=pDoc->GetPAVIHandler(); //AVIHandler是一个关于AVI操作的类,在doc类中打开并
  //存储在doc中定义的一个对象里
int tempBeg; //用来保存从对话框中传递的参数
if(numdlg.DoModal()==IDOK)
{
tempBeg=numdlg.m_numBeg; //得到对话框中的参数
CSize size;
size.cx=pAviHandler->GetFrameWidth();
size.cy=pAviHandler->GetFrameHeight(); 
CBmpShow bmpShow(pAviHandler->GetPgf(),tempBeg,size); //CBmpShow 是用来提取AVI图像的某一帧,
  //并把图像数据部分存在一个对象里
   
  bmpShow.AchieveFrame(); //CBmopShow中的提取AVI某一帧的函数

  //一下是新建一个窗口显示,提取出的图像

CMainFrame* pFrame = (CMainFrame *)(AfxGetApp()->m_pMainWnd);
pFrame->SendMessage(WM_COMMAND, ID_FILE_NEW);
CEditAViView* pView=(CEditAViView*)pFrame->MDIGetActive()->GetActiveView();
CEditAViDoc* pDocNew=pView->GetDocument();
CImgDib *dibNew=pDocNew->GetPDib(); //CImgDib是用来显示提取出的BMP图像
dibNew->ReplaceDib(size,24, bmpShow.GetPBmpData());

pView->OnInitialUpdate();
pDocNew->SetModifiedFlag(TRUE);
pDocNew->UpdateAllViews(pView);
}

我的程序问题是,当打开一个视频对象后,第一次点菜单中的按钮调用这个函数能提取出图片,可是第二次再点菜单实现连续提取时就会显示内存不足时怎么回事啊,求各位大神给解释

一线是CBmpShow 类中的函数
CBmpShow::CBmpShow()
{
  this->m_nFrame=0;
this->m_pBmpData=NULL;

}

CBmpShow::~CBmpShow()
{
  if(m_pBmpData!=NULL)
{
delete m_pBmpData;
m_pBmpData=NULL;
}
}


CBmpShow::CBmpShow(PGETFRAME pgf,int n,CSize size)
{

this->m_height=size.cy;
this->m_width=size.cx;
this->m_nFrame=n;
this->m_pgf=pgf;
this->m_pBmpData=NULL;
}

unsigned char* CBmpShow::GetPBmpData()
{
return m_pBmpData;
}

void CBmpShow::AchieveFrame()
{
m_pBmpData =new unsigned char [m_width*m_height*3];
m_pBmpData=(unsigned char*)AVIStreamGetFrame(m_pgf,m_nFrame)+40;
}


一下是CImgDib类中的一些函数


/***********************************************************************
* 函数名称:
* CImgDib()
*
*说明:无参数的构造函数,对成员变量进行初始化
***********************************************************************/
CImgDib::CImgDib()
{



m_pImgData=NULL; // 图像数据指针为空

m_lpBmpInfoHead=NULL; // 图像信息头指针为空

}

/***********************************************************************
* 函数名称:
* CImgDib()
*
*函数参数:
* CSize size -图像大小(宽、高)
* int nBitCount -每像素比特数
* LPRGBQUAD lpColorTable -颜色表指针
* unsigned char *pImgData -位图数据指针
*
*返回值:
* 无
*
*说明:本函数为带参数的构造函数,给定位图的大小、每像素位数、颜色表
* 及位图数据生成一个CImgDib类对象
***********************************************************************/


/***********************************************************************
* 函数名称:
* ~CImgDib()

*
*说明:析构函数,释放资源
***********************************************************************/
CImgDib::~CImgDib()
{
 


}



/***********************************************************************
* 函数名称:
* Draw()
*
*函数参数:
* CDC* pDC -设备环境指针
* CPoint origin -显示矩形区域的左上角
* CSize size -显示矩形区域的尺寸
*
*返回值:
* 0为失败,1为成功
*
*说明:给定设备环境指针,以及需要显示的矩形区域在设备环境中的位置
* 将m_lpDib所指向的DIB显示出来
***********************************************************************/
BOOL CImgDib::Draw(CDC* pDC, CPoint origin, CSize size)
{



//设置位图伸缩模式