在VC中如何检查内存是否泄漏!!!
我有一个代码,运行时显示内存不足,调试时说有内存泄漏//hough检测头文件
#ifndef _INSIDE_VISUAL_CPP_HOUGHDEC
#define _INSIDE_VISUAL_CPP_HOUGHDEC
#include "ImgCenterDib.h"
class ImgHoughDec : public ImgCenterDib
{
public:
unsigned char* m_pImgDataOut;
LPRGBQUAD m_lpColorTableOut;
int m_nBitCountOut;
int m_nColorTableLength;
public:
ImgHoughDec();
ImgHoughDec(CSize size, int nBitCount, LPRGBQUAD lpColorTable, unsigned char* pImgData);
~ImgHoughDec();
CSize GetDemisions();
//HOUGH变换
void Hough(float *pRadius, float *pAngle);
void HoughDectLine(float *pRadius, float *pAngle);
private:
int m_nimgHeightOut;
int m_nimgWidthOut;
void HoughTransform(unsigned char* imgBinaryIn,int* houghBuf,float *radius, float *angle);
};
#endif//_INSIDE_VISUAL_CPP_IMAGESEGEMENT
//hough检测的实现文件
#include "stdafx.h"
#include "houghdec.h"
#include "math.h"
/****************************
析构/构造函数
****************************/
ImgHoughDec::ImgHoughDec()
{
m_pImgDataOut=NULL;
m_lpColorTableOut=NULL;
m_nBitCountOut=0;
m_nColorTableLength=0;
m_nimgHeightOut=0;
m_nimgWidthOut=0;
}
ImgHoughDec::ImgHoughDec(CSize size, int nBitCount, LPRGBQUAD lpColorTable, unsigned char* pImgData)
:ImgCenterDib(size, nBitCount, lpColorTable, pImgData)//初始化
{
m_nBitCountOut=m_nBitCount; //输出图像每像素位数
m_lpColorTableOut=NULL; //输出图像颜色表
m_nColorTableLength= ComputeColorTabalLength(m_nBitCountOut);
//灰度图像颜色表长度为256
if (m_nColorTableLength!=0)
{
m_lpColorTableOut= new RGBQUAD[m_nColorTableLength];
memcpy(m_lpColorTableOut,m_lpColorTable,sizeof(RGBQUAD)*m_nColorTableLength);
}
m_nimgWidthOut=m_imgWidth; //宽
m_nimgHeightOut=m_imgHeight; //高
}
ImgHoughDec::~ImgHoughDec()
{
//释放输出图像位图数据缓冲区
if(m_pImgDataOut!=NULL)
{
delete []m_pImgDataOut;
m_pImgDataOut=NULL;
}
//释放输出图像颜色表
if(m_lpColorTableOut!=NULL)
{
delete []m_lpColorTableOut;
m_lpColorTableOut=NULL;
}
}
CSize ImgHoughDec::GetDemisions()
{
if(m_pImgDataOut==NULL)
return CSize(0,0);
return CSize(m_nimgWidthOut,m_nimgHeightOut);
}
/*********************************
下面的3个成员函数分别实现极坐标下的线检测hough变换,hough变换,hough检测最强直线
//它的输入图像为边缘检测后的二值图像
*********************************/
/**************************
//极坐标下的线检测hough变换
* 函数名称:
* HoughTransform()
*
*函数参数:
* unsigned char *imgBinaryIn -二值图像输入数据指针
* int *houghBuf -Hough变换所需要的缓冲区指针
* float *radius -用来返回Hough变换检测出来的最长直线的极半径
* float *angle -用来返回Hough变换检测出来的最长直线的角度
*说明:给定图像数据,通过线检测hough变换检测直线
**********************************************/
void ImgHoughDec::HoughTransform(unsigned char *imgBinaryIn, int *houghBuf,
float *pRadius, float *pAngle)
{
//申请循环变量
int i, j;
int HoughWidth=(int)sqrt(m_imgHeight*m_imgHeight+m_imgWidth*m_imgWidth);
int HoughHeight=180;
houghBuf=new int[HoughHeight*HoughWidth];
//清理变换空间累加数组
for(i=0;i<HoughHeight;i++){
for(j=0;j<HoughWidth;j++){
*(houghBuf+i*HoughWidth+j)=0;
}
}
//循环变量
int radius, angle;
//中间变量
float tempR;
//遍历图像数据
for(i=0; i<m_imgHeight; i++){
for(j=0; j<m_imgWidth; j++){
//出现一个目标点
if(*(imgBinaryIn+i*m_imgWidth+j)==1){
//a代表角度的循环变量,在变换空间累加数组的垂直方向上
for(angle=0;angle<HoughHeight;angle++){
//根据当前遍历的角度及x,y值求取对应极半径
tempR=j*cos(angle*2*3.1415926/360)+i*sin(angle*2*3.1415926/360);
radius=(int) (tempR+HoughWidth)/2;
//累加数组累加
*(houghBuf+angle*HoughWidth+ radius)+=1;
}
}
}
}
//求累加数组的极大值,并记录此时的数组坐标
int max, maxR, maxA;
max=*(houghBuf+0*HoughWidth+0);
maxR=0;
maxA=0;
for(angle=0;angle<HoughHeight;angle++){
for(radius=0;radius<HoughWidth;radius++){
if(max<=*(houghBuf+angle*HoughWidth+radius)){
max=*(houghBuf+angle*HoughWidth+radius);
maxR=radius;
maxA=angle;
}
}
}
//将极大值位置转换成极坐标半径和角度,并通过参数返回
*pRadius=(maxR-HoughWidth/2);
*pAngle=(maxA-HoughHeight/2);
}
/***********************************************************************
* 函数名称:
* Hough()
*
*函数参数:
* float radiusResolution -Hough变换的极坐标半径的检测分辨率
* float angleResolution -Hough变换的角度检测分辨率
* float *radius -用来返回Hough变换检测出来的最长直线的极半径
* float *angle -用来返回Hough变换检测出来的最长直线的角度
*返回值:
* 无
*
*说明:给定Hough变换的极半径分辨率和角度分辨率,通过调用HoughTransform()
* 对输入图像m_pImgData做线检测,Hough变换的结果输出到m_pImgDataOut中
***********************************************************************/
void ImgHoughDec::Hough(float *pRadius, float *pAngle)
{
//只处理灰度图像
if(m_nBitCount!=8)
return;
//图像的中心为坐标原点,线与原点的距离最大
//为sqrt(m_imgWidth*m_imgWidth+m_imgHeight*m_imgHeight)/2,所以Hough变换
//的高度为:
int houghWidth=(int) sqrt(m_imgWidth*m_imgWidth+m_imgHeight*m_imgHeight);
houghWidth= houghWidth;
//线的角度在[-90,90]之间,所以申请的累加数组高度为181/angleResolution
int houghHeight=180;
//申请累加数组缓冲区
int* houghBuf=new int[houghWidth*houghHeight];
//Hough变换,结果存入houghBuf中
HoughTransform(m_pImgData, houghBuf, pRadius, pAngle);
//输出图像的大小是Hough变换累加数组的大小
int lineByteOut=(m_nimgWidthOut*m_nBitCountOut/8+3)/4*4;
m_pImgDataOut=new unsigned char[lineByteOut*m_nimgHeightOut];
//求出累加数组的最大值
int i, j, max=0;
for(i=0;i<m_nimgHeightOut;i++){
for(j=0;j<m_nimgWidthOut;j++){
if(max<=*(houghBuf+i*houghWidth+j))
max=*(houghBuf+i*houghWidth+j);
}
}
//根据最大值将累加数组映射到输出图像
for(i=0;i<m_nimgHeightOut;i++){
for(j=0;j<m_nimgWidthOut;j++){
*(m_pImgDataOut+i*lineByteOut+j)=
*(houghBuf+i*houghWidth+j)*255.0/max;
}
}
//释放缓冲区
delete []houghBuf;
houghBuf=NULL;
}
//其消息映射,
/hough检测直线
void CStudyView::OnHoughDectLine()
{
// TODO: Add your command handler code here
CStudyDoc *pDoc=GetDocument();
ImgCenterDib* pdib=pDoc->GetPDib();
//只处理灰度图像
if(pdib->m_nBitCount!=8 && pdib->m_nBitCount!=24)
{
::MessageBox(0,"只处理灰度图像",MB_OK,0);
return;
}
//只能处理二值图像
int i,j;
CSize size=pdib->GetDimensions();
int lineByte=(size.cx*(pdib->m_nBitCount)/8+3)/4*4;
int flag=1;
for (i=0;i<size.cy;i++)
{
for (j=0;j<size.cx;j++)
{
if (*(pdib->m_pImgData+i*lineByte+j)!= 0 && *(pdib->m_pImgData+i*lineByte+j)!=255)
{
flag=0;
break;
}
}
}
if (!flag)
{
::MessageBox(0,"需要输入二值图像",MB_OK,0);
return;
}
HoughDetection Houghton(pdib->GetDimensions(),pdib->m_nBitCount,pdib->m_lpColorTable,pdib->m_pImgData);
Houghton.ImgHough(pdib->m_pImgData,Houghton.m_pImgDataOut);
//打开新视图,显示结果
CMainFrame* pFrame = (CMainFrame *)(AfxGetApp()->m_pMainWnd);
//发送一个新建文件的消息,创建一个新的文档-视图
pFrame->SendMessage(WM_COMMAND, ID_FILE_NEW);
// ID_FILE_NEW表示文件里面的新建
//获取新建视图指针
CStudyView* pView=(CStudyView*)pFrame->MDIGetActive()->GetActiveView();
//获取相关联的新的文档类指针
CStudyDoc* pDocNew=pView->GetDocument();
//获取新文档中的ImgCenterDib类对象指针
ImgCenterDib *dib=pDocNew->GetPDib();
//调用ReplaceDib,用改变以后的位图数据替换原位图,调用ImgCenterDib类中的
//子函数ReplaceDib()
dib->ReplaceDib(Houghton.GetDimensions(),Houghton.m_nBitCountOut,Houghton.m_lpColorTableOut,Houghton.m_pImgDataOut);
//设置滚动窗口
pView->OnInitialUpdate();
//文档数据置脏,提示存盘信息
pDocNew->SetModifiedFlag(TRUE);
//各视图刷新显示
pDocNew->UpdateAllViews(pView);
}