| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1120 人关注过本帖
标题:在VC中如何检查内存是否泄漏!!!
只看楼主 加入收藏
spywzl
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2010-3-24
结帖率:50%
收藏
 问题点数:0 回复次数:1 
在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);
   
}
搜索更多相关主题的帖子: 检查 泄漏 内存 
2010-04-07 19:15
秀痘魔导士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:250
专家分:1150
注 册:2009-12-23
收藏
得分:0 
BoundsChecker

不过这么一点代码量的话,自己详细查一下代码
2010-04-08 14:36
快速回复:在VC中如何检查内存是否泄漏!!!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018776 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved