对开发中常见的内存泄露,GDI泄露进行检测

 

对开发中常见的内存泄露,GDI泄露进行检测

一、GDI泄露检测方法:

在软件测试阶段,可以通过procexp.exe 工具,或是通过任务管理器中选择GDI对象来查看软件GDI的对象是使用情况。

注意点:Create出来的GDI对象,都要用DeleteObject来释放;Create出来的DC,都要用DeleteDC来释放,GetDC得出的DC,要用ReleaseDC来释放。

 

以下是一些常用到的函数:

 

1、  检查GetWindowDC(), 后面是否有ReleaseDC();

2、  检测GetDC();后面是否有ReleaseDC();

 

3、  检测画刷CBrush:

CreateSolidBrush()-》 DeleteObject();

 

4、  检测画笔 CPen

CreatePen()->DeleteObject();

 

5、  检测创建字体CFont

CreateFont->DeleteObject();

CreatePointFont()->DeleteObject();

 

6、  检测 创建WIN32窗口

HWND hwnd = ::CreateWindow ()  ->  DestroyWindow(hwnd);

 

7、  CBitmapbmp;
bmp.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height());

 后面要有bmp.DeleteObject();

 

8、  CFont *pOldFont =pDC->SelectObject(&m_font);

是否有pDC->SelectObject(pOldFont);

 

9、  CRgn

CreateRoundRectRgn() ->  DeleteObject();

 

10、Graphics gc(pDC)   -> gc.ReleaseDC(pDC);

 

11、CDialog对话框  Create() 出来的,需要有  DestroyWindow();

 

12、凡是通过函数得到句柄的都需要用CloseHandle(句柄)来释放;

如:HANDLE, HBRUSH ,HPEN

 HANDLE hFile = CreateFile();  -> CloseHandle(hFile);

 

 

二、内存的检测方法:

通过任务管理器中的“内存”列表,或是procexp.exe来观察是否出现内存泄露

1、检查下列函数是否有一一对应:

      new   -> delete;

     Malloc -> free;

     GlobalAlloc  -> GlobalFree

 

 

2、通过调试器和CRT调试堆来检测泄露

把这个语句放到软件的结束部分_CrtDumpMemoryLeaks(); 在调试下运行程序时,如果有泄漏,就会在输出窗口显示内存泄露信息。

 

3、借助内存泄露检测工具如:BChecker6.01 这个是适合VC6的,有时间可以去下来使用。

 

时间: 2024-10-29 14:29:27

对开发中常见的内存泄露,GDI泄露进行检测的相关文章

Android开发中常见的内存泄漏及避免总结

内存泄漏产生的原因 当一个对象已经不需要再使用了,本该被回收时,而有另外一个正在使用的对象持有它的引用从而导致它不能被回收,这导致本该被回收的对象不能被回收而停留在堆内存中,这就产生了内存泄漏. 内存泄漏对程序的影响? 内存泄漏是造成应用程序OOM的主要原因之一!我们知道Android系统为每个应用程序分配的内存有限,而当一个应用中产生的内存泄漏比较多时,这就难免会导致应用所需要的内存超过这个系统分配的内存限额,这就造成了内存溢出而导致应用Crash. Android中常见的内存泄漏汇总 单例造

多线程-Delphi开发中遇到的内存错误问题

问题描述 Delphi开发中遇到的内存错误问题 #背景介绍 我做了一个模拟的dll,模拟原来的发送消息的dll,实现的功能是将消息(XML)解包写到DBF中 多线程环境 #同样的代码,有以下两种情况 没有使用断点调试的时候,运行到发送(也就是写到DBF)的时候就会报地址错误(这一步是通过记录日志信息确定在哪一步报错的),但是线程还是继续执行,不过每次运行到发送的时候就报错 但是如果使用断点调试的话,跟踪断点到发送函数的时候就没有报错,从来也不报错 这个问题我实在是没有思路,希望有经验的前辈能指点

asp.net开发中常见公共捕获异常方式总结(附源码)_实用技巧

本文实例总结了asp.net开发中常见公共捕获异常方式.分享给大家供大家参考,具体如下: 前言:在实际开发过程中,对于一个应用系统来说,应该有自己的一套成熟的异常处理框架,这样当异常发生时,也能得到统一的处理风格,将异常信息优雅地反馈给开发人员和用户.我们都知道,.net的异常处理是按照"异常链"的方式从底层向高层逐层抛出,如果不能尽可能地早判断异常发生的边界并捕获异常,CLR会自动帮我们处理,但是这样系统的开销是非常大的,所以异常处理的一个重要原则是"早发现早抛出早处理&q

Winform开发中常见界面的DevExpress处理操作

我们在开发Winform程序的时候,需要经常性的对界面的一些控件进行初始化,或者经常简单的封装,以方便我们在界面设计过程中反复使用.本文主要介绍在我的一些项目中经常性的界面处理操作和代码,以便为大家开发的时候提供必要的参考. 1.选择用户的控件封装操作 在一些系统模块里面,我们需要选择系统人员作为经办人员的操作,如下面几个界面场景所示. 我们注意到,一般在我们选择的时候,界面会弹出一个新的层给我们选择,里面通过列表详细展示相关的信息,还可以支持搜索,非常方便. 当我们完成选择的时候,我们看到界面

android开发中的java内存泄露分析

做了较长时间的android开发了,发现其实android应用开发入门容易,但是进阶或者成为高级工程师,需要具备的基础能力还是非常高的:性能优化.内存泄露.apk瘦身.热修复等等,这些都非常的考验一个人的能力.android成长之路还很长,自己会持续的走下去.本文主要介绍android内存泄露方面的知识.其实要真的理解内存泄露,需要对JVM.java语言有一定的了解,在这个基础上就比较容易理解本文了. 一.内存泄露概念 在java中,如果一个对象没有可用价值了,但又被其他引用所指向,那么这个对象

开发中常见的中文乱码原因

在开发中,我们常常遇到中文乱码的问题,比如: &浏览器中看到的 Jsp/Servlet 页面中的汉字成了 '?'      &浏览器中看到的 Servlet 页面中的汉字都成了乱码   &Jsp/Servlet 页面无法显示 GBK 汉字. &Jsp/Servlet 不能接收 form 提交的汉字. &JSP/Servlet 数据库读写无法获得正确的内容. 隐藏在这些问题后面的是各种错误的字符转换和处理.解决类似的字符encoding问题,需要了解 Jsp/Serv

Web开发中常见的安全缺陷及解决办法

web|安全|解决 一.不能盲目相信用户输入 二.五种常见的ASP.NET安全缺陷 2.1 篡改参数 2.2 篡改参数之二 2.3 信息泄漏 2.4 SQL注入式攻击 2.5 跨站脚本执行 三.使用自动安全测试工具 正文: 保证应用程序的安全应当从编写第一行代码的时候开始做起,原因很简单,随着应用规模的发展,修补安全漏洞所需的代价也随之快速增长.根据IBM的系统科学协会(Systems Sciences Institute)的研究,如果等到软件部署之后再来修补缺陷,其代价相当于开发期间检测和消除

Java开发中常见的异常问题

作为一名游戏开发者,程序员,很自然必须熟悉对程序的调试方法.而要调试程序,自然需要对程序中的常见的异常有一定的了解,这些日子很多朋友都提出了很多问题,都是关于游戏中的报错,因此在这里我将一些常见的程序中的异常列举出来给大家参考: 1. java.lang.NullPointerException 这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对象,这个错误经常出现在创建图片,调用数组这些操作中,比如图片未经初始化,或者图片

iOS开发中常见的解析XML的类库以及简要安装方法_IOS

在iPhone开发中,XML的解析有很多选择,iOS SDK提供了NSXMLParser和libxml2两个类库,另外还有很多第三方类库可选,例如TBXML.TouchXML.KissXML.TinyXML和GDataXML.问题是应该选择哪一个呢? 解析 XML 通常有两种方式,DOM 和 SAX: DOM解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过遍历树结构可以检索任意XML节点,读取它的属性和值.而且通常情况下,可以借助XPath,直接查询XML节点. SAX