大家知道,当在一个项目中包含了如下语句,则可以开始Debug C/C++的内存泄漏问题
#define _CRTDBG_MAP_ALLOC  
#include <stdlib.h>  
#include <crtdbg.h>  还可以使用_CrtDumpMemoryLeaks();来确定内存是否发生了泄露~
产生如下的输出
Detected memory leaks!Dumping objects ->  
C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18}   
normal block at 0x00780E80, 64 bytes long.Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD  
Object dump complete.  那么,我想问的是,当_CrtDumpMemoryLeaks()运行时,检测到了泄漏,而输出窗口中的产生错误的行数(如上的eaktest.cpp(20) 中的20)为什么是申请这块空间的行数,而不是发生堆泄漏的行数呢?
如果真的是这样,那么有没有什么办法可以具体检测出泄漏发生的地方呢?谢谢大家了~

解决方案 »

  1.   

    大家知道,当在一个项目中包含了如下语句,则可以开始Debug C/C++的内存泄漏问题
    ==汗,我还是第一次知道啊......学习了。
      

  2.   

    如果真的是这样,那么有没有什么办法可以具体检测出泄漏发生的地方呢?你已经检测出泄漏发生的地方,在leaktest.cpp(20)所申请的内存直到程序结束还没有释放.
      

  3.   

    Visual leak Detected也蛮好用的,和这个有点类似
      

  4.   

    _CrtDumpMemoryLeaks() 会跟踪new 出来的内存(new的时候会记录它的行数),但是没人知道你在那里释放他,他只知道你最后没有释放他! 
    也就是什么时候释放是你的事,他只管告诉你:我在XX行探到你申请的内存了,但是你没有释放!
      

  5.   

    呵呵,“而不是发生堆泄漏的行数呢”,因为 VC 实现的方式是通过在 new / malloc 的时候记录分配文件名称(__FILE__)和文件行号(__LINE__)。
      

  6.   

    呃,讲的都没听说过。我好想记得VS自带内存泄漏检测的吧,如果出现内存泄漏,VS debug时可以在输出窗口提示出来。我用的是VS2010。查了下用法, 这个是挺简单的。
      

  7.   

    照楼上这么多位的说法,看来使我想错了~。。那么我现在想问个问题,如果free()或delete错误,有没有什么具体的函数可以检查出原因?
      

  8.   

    free / delete 出错基本是溢出所致。至于溢出发生的位置还是要手动调试慢慢的找。你现在是内存泄漏,不是溢出,只是说明该delete/free的内存你没有这么做,在正确的地方delete/free就好了。
      

  9.   

    可能是因为“free()或delete错误”,所以把free()或delete删除了,接着就内存泄漏了。
    还是要查到”free()或delete错误“的原因。
      

  10.   

    当然有啊,我给你分析下。==汗,我还是第一次知道啊......学习了。
    汗,名词,但在这里是汗颜的简称,也就是惭愧的意思,想毕大家都知道吧。但出现在一句话的开头在朗读时候比较给力,用的非常的好,比如屈原会在句子结束时加个“兮”,作为语气助词,我认为“汗”在这里也可以理解为语气助词。有不同意见的可以继续讨论。
    我还是第一次知道啊......这句话讨论起来我今天就别睡了,还是下次再说吧。
    学习了。表示是大板向楼主和楼主的这个帖子学习的意思,也就是受教了的意思。说明lz是值得我们学习的,对内存泄漏的问题我们应该在思想上引起高度的重视,要长抓不懈,警钟长鸣。同时,我们也不应该单纯理解为谦虚受教的意思,这其实是向大家做个表率,知之为知之,不知为不知,三人行,必有我师,学海无涯苦作舟,回头是岸啊!
    好了,分析完毕,lz慢慢体会吧。为了防止被当作水帖吃掉,还是回答问题吧。
    如果free()或delete错误,有没有什么具体的函数可以检查出原因?据我所知这个真没有。
      

  11.   

    用这个
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif