如何查看程序是否有内存泄漏,并且定位内存泄漏代码位置(VC++)

1、什么是内存泄漏?

内存泄漏指的是在程序里动态申请的内存在使用完后,没有进行释放,导致这部分内存没有被系统回收,久而久之,可能导致程序内存不断增大,系统内存不足……引发一系列灾难性后果;(关于程序申请内存分配方式,详见:内存分配方式

2、零容忍

排除内存泄漏对于程序的稳健型特别重要,尤其是程序需要长时间、稳定地运行时。C++这类动态内存申请释放都是由程序员控制的语言,稍不注意,很有可能就会有未释放的内存。这类问题,虽然有的时候仅仅只是泄漏了几个字节,但是危害极大。因此,我们一般都是要做到:内存泄漏零容忍!!!

3、检查、定位内存泄漏

检查方法:

在main函数最后面一行,加上一句_CrtDumpMemoryLeaks()。调试程序,自然关闭程序让其退出(不要定制调试),查看输出:

Detected memory leaks!

Dumping objects ->

{453} normal block at 0x02432CA8, 868 bytes long.

Data: <404303374       > 34 30 34 33 30 33 33 37 34 00 00 00 00 00 00 00

{447} normal block at 0x024328B0, 868 bytes long.

Data: <404303374       > 34 30 34 33 30 33 33 37 34 00 00 00 00 00 00 00

{441} normal block at 0x024324B8, 868 bytes long.

Data: <404303374       > 34 30 34 33 30 33 33 37 34 00 00 00 00 00 00 00

{435} normal block at 0x024320C0, 868 bytes long.

Data: <404303374       > 34 30 34 33 30 33 33 37 34 00 00 00 00 00 00 00

{429} normal block at 0x02431CC8, 868 bytes long.

Data: <404303374       > 34 30 34 33 30 33 33 37 34 00 00 00 00 00 00 00

{212} normal block at 0x01E1BF30, 44 bytes long.

Data: <`               > 60 B3 E1 01 CD CD CD CD CD CD CD CD CD CD CD CD

{204} normal block at 0x01E1B2C8, 24 bytes long.

Data: <                > C8 B2 E1 01 C8 B2 E1 01 C8 B2 E1 01 CD CD CD CD

{138} normal block at 0x01E15680, 332 bytes long.

Data: <                > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

{137} normal block at 0x01E15628, 24 bytes long.

Data: <(V  (V  (V      > 28 56 E1 01 28 56 E1 01 28 56 E1 01 CD CD CD CD

Object dump complete.

程序“[4860] TradeServer.exe: 本机”已退出,返回值为 0 (0x0)。

取其中一条详细说明:{453} normal block at 0x02432CA8, 868 bytes long.

被{}包围的453就是我们需要的内存泄漏定位值,868 bytes long就是说这个地方有868比特内存没有释放。

接下来,定位代码位置:

在main函数第一行加上:_CrtSetBreakAlloc(453); 意思就是在申请453这块内存的位置中断。然后调试程序,……程序中断了。查看调用堆栈

双击我们的代码调用的最后一个函数,这里是CDbQuery::UpdateDatas(),就定位到了申请内存的代码:

好了,我们总算知道是哪里出问题了,这块内存没有释放啊。改代码,修复好这个。然后继续…………,知道调试输出中没有normal block ,程序没有内存泄漏了。

记得加上头文件:#include <crtdbg.h>

最后要注意一点的,并不是说有normal block一定就有内存泄漏,当你的程序中有全局变量的时候,全局变量的释放示在main函数退出后,所以在main函数最后_CrtDumpMemoryLeaks()会认为全局申请的内存没有释放,造成内存泄漏的假象。如何规避呢?我通常是把全局变量声明成指针在main函数中new 在main函数中delete,然后再调用_CrtDumpMemoryLeaks(),这样就不会误判了。

时间: 2024-10-12 13:06:13

如何查看程序是否有内存泄漏,并且定位内存泄漏代码位置(VC++)的相关文章

C++内存泄露问题定位经验案例

百度百科: 内存泄漏也称作"存储渗漏",用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元.直到程序结束.(其实说白了就是该内存空间使用完毕之后未回收)即所谓内存泄漏. 内存泄漏形象的比喻是"操作系统可提供给所有进程的存储空间正在被某个进程榨干",最终结果是程序运行时间越长,占用存储空间越来越多,最终用尽全部存储空间,整个系统崩溃.所以"内存泄漏"是从操作系统的角度来看的.这里的存储空间并不是指物理内存,而是指虚拟内

如何查看程序可使用的最大内存及内存使用情况

当加载带有大量图片的列表时,通常我们都要考虑到图片达到一定上限时,内存不足引发OOM导致程序崩溃的问题.下一步也许就是去找个图片加载开源框架来一劳永逸.OOM不急着解决,先来了解下关于程序可用内存的一丢丢知识.在面对OOM的时候,你有没有想过这些: 1.什么是OOM  OOM都知道是Out Of Memory的缩写也就是内存溢出,通俗点说就是内存用完了. 2.为什么会OOM  内存使用超过上限导致了内存溢出.例如内存泄露,当程序运行过程中动态申请的内存空间不再使用但是又没有及时释放,从而导致应用

JS内存泄漏 和Chrome 内存分析工具简介(摘)

原文地址:http://web.jobbole.com/88463/ JavaScript 中 4 种常见的内存泄露陷阱 原文:Sebastián Peyrott 译文:伯乐在线专栏作者 - ARIGATO 链接:http://web.jobbole.com/88463/ 点击 → 了解如何加入专栏作者 了解 JavaScript 的内存泄露和解决方式! 在这篇文章中我们将要探索客户端 JavaScript 代码中常见的一些内存泄漏的情况,并且学习如何使用 Chrome 的开发工具来发现他们.读

(转)java内存泄漏的定位与分析

转自:http://blog.csdn.net/x_i_y_u_e/article/details/51137492 1.为什么会发生内存泄漏 java 如何检测内在泄漏呢?我们需要一些工具进行检测,并发现内存泄漏问题,不然很容易发生down机问题. 编写java程序最为方便的地方就是我们不需要管理内存的分配和释放,一切由jvm来进行处理,当java对象不再被应用时,等到堆内存不够用时,jvm会进行垃圾回收,清除这些对象占用的堆内存空间,如果对象一直被应用,jvm无法对其进行回收,创建新的对象时

java内存泄漏的定位与分析

1.为什么会发生内存泄漏 java 如何检测内在泄漏呢?我们需要一些工具进行检测,并发现内存泄漏问题,不然很容易发生down机问题. 编写java程序最为方便的地方就是我们不需要管理内存的分配和释放,一切由jvm来进行处理,当java对象不再被应用时,等到堆内存不够用时,jvm会进行垃圾回收,清除这些对象占用的堆内存空间,如果对象一直被应用,jvm无法对其进行回收,创建新的对象时,无法从Heap中获取足够的内存分配给对象,这时候就会导致内存溢出.而出现内存泄露的地方,一般是不断的往容器中存放对象

C++应用程序性能优化(五)——操作系统的内存管理

C++应用程序性能优化(五)--操作系统的内存管理 一.操作系统内存管理简介 长期以来,在计算机系统中,内存都是一种紧缺和宝贵的资源,应用程序必须在载入内存后才能执行.早期,在内存空间不够大时,同时运行的应用程序的数量会受到很大的限制,甚至当某个应用程序在某个运行时所需内存超过物理内存时,应用程序就会无法运行.现代操作系统(Windows.Linux)通过引入虚拟内存进行内存管理,解决了应用程序在内存不足时不能运行的问题.本质上,虚拟内存就是要让一个程序的代码和数据在没有全部载入内存时即可运行.

最常见的Android内存优化方式及防止泄漏造成OOM总结篇

前言 内存优化目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题.内存泄漏大家都不陌生了,简单粗俗的讲,就是该被释放的对象没有释放,一直被某个或某些实例所持有却不再被使用导致 GC 不能回收.既然说到内存泄漏和优化,就不得不先简单了解一下内存分配策略,然后再举常见泄漏例子和解决方法,最后做一下总结,这样更直观全面了解Android内存方面处理. 内存分配 内存分配策略有三种,分别是静态.栈式和堆式.对应的的内存空间主要分别是静态存储区(也称方法区).栈区和堆区.如下: 静态存储区:

(转)从内存管 理、内存泄漏、内存回收探讨C++内存管理

http://www.cr173.com/html/18898_all.html 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对 C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生,因此要想成为C++高手,内存管理一关是必须要过的,除非放弃 C++,转到Java或者.NET,他们的内存管理基本是自动的,当然你也放弃了自由和对内存的支配权,还放弃了C++超绝的性能

黑马程序员--Objective-C之--OC中的内存管理

对于面向对象的变成语言,程序需要不断地创建对象. 初始,创建的所有程序通常都有指针指向它,程序可能需要访问这些对象的实例变量或调用这些对象的方法,随着程序的不断执行,程序再次创建了一些新的对象, 而那些老的对象已经不会再被调用,也不再有指针指向他们,如果程序没有回收他们占用的内存,就会出现内存泄露. 如果程序一直泄露内存,那么可用内存就会越来越少,直到没有足够的内存,程序將会崩溃.目前,主要有两种管理内存的技术,一是引用计数,二是垃圾回收. iOS平台目前只支持引用计数,Mac平台支持垃圾回收.