Windows 下有哪些ios内存泄露检测工具监测工具

Dr Memory(c++ 内存泄漏检测工具)V1.7.2 官方版软件下载 - 绿色先锋下载 - 绿色软件下载站
赞助商链接
本类月下载排行
本类周下载排行
常用软件推荐
Dr Memory(c++ 内存泄漏检测工具)是一款非常便捷的开源免费的内存检测程序,它能够及时发现内存相关的编程错误,比如未初始化访问、内存非法访问以及内存泄露等。它不仅能够在 Linux 下面工作,也能在微软的 Windows 操作系统上工作。不过,本文撰写时,DrMemory 仅能支持 32 位程序,这是它的一个巨大缺陷,但相信随着开发的进行,DrMemory 会推出支持 64 位程序的版本。
检测实例:
Dr. Memory 建立在 DynamoRIO 这个动态二进制插桩平台上。动态监测程序的运行,并对内存访问相关的执行代码进行动态修改,记录其行为,并采用先进的算法进行错误检查。
根据 DrMemory 开发人员发表在 CGO 2011上的论文 Practical Memory Checking with Dr. Memory,DrMemory 对程序的正常执行影响较小,这在同类工具中是比较领先的。其 performance 和 Valgrind 的比较如图 1 所示(图片源自 DrMemory 主页):
图 1. 和 Valgrind 的性能比较
Valgrind 对程序的正常运行影响较大,一般来说如果进行全面内存检测,会使程序的运行速度有 50 到 300 倍的减慢。而 DrMemory 在这个方面则有一定的优势。
易用性和性能是 DrMemory 的主要优点,此外 DrMemory 可以用于调试 Windows 程序,因此它被广泛认为是 Windows 上的 Valgrind 替代工具。在 Linux 平台中,DrMemory 也往往可以作为 Valgrind 之外的另一个选择。
DrMemory 对内存泄露的监测采用了比较独特的算法,大量减少了&false positive&,即虚假错误。如果您使用 Valgrind 等工具后仍无法找到程序中的内存错误,不妨试试 DrMemory 吧。
Windows 上 DrMemory 提供了可执行安装包,只需点击下一步,即可安装完毕。
DrMemory,第一印象 DrMemory 的使用很简单,可以说它是傻瓜式。正常运行一个程序时,我们在 shell 中敲入命令然后回车。为了用 DrMemory 检查,只需要在
Hello DrMemory,第一印象
DrMemory 的使用很简单,可以说它是傻瓜式。正常运行一个程序时,我们在 shell 中敲入命令然后回车。为了用 DrMemory 检查,只需要在正常命令之前加入 drmemory.pl,比如程序检查程序 t,那么就这样:
drmemory.pl& ./t
在计算机领域,Helloworld 总是第一个程序。让我们写一个 HelloDrMemory,来和 DrMemory 简单接触一下吧。
清单 1,Hello DrMem 例子程序
1:&& int main()
3:&&&& char *
5:&&&& for(i=0;i&100;i++)
7:&&&&&& ptr=(char*)malloc(i);
8:&&&&&& if(i%2) free(ptr);
10:&&& return 0;
很明显,有 50 个内存泄露,都在同一行代码中(Line&8)。让我们用 Dr Memory 来检查它。
屏幕上会有如上所示的错误汇总,注意看 ERRORS FOUND 下面的第 5 行:&50 total leaks&。不错吧。根据提示,更多的细节被写入一个 result 文本文件。打开并查看该文件,就可以知道程序在哪里出现了内存错误了。真是太方便了。不过 result 文件是否容易阅读呢?下面我们来详细解释如何阅读 DrMemory 产生的 result 文件。
DrMemory 报告解读细节
内存非法访问
DrMemory 认为任何对未分配内存区域的读写都是非法的。在 Linux 中,应用程序可以用以下几个方式分配内存:
调用 mmap (或者 mremap)
调用 malloc 在堆上分配内存
使用 alloca 在栈上分配内存
非法访问就是对以上三种方法分配的内存区域之外进行的访问。常见的问题包括 buffer overflow、数组越界、读写已经 free 的内存、堆栈溢出等等。让我们测试下面这个问题程序。
Buffer overflow
例子程序的第 5 到 6 行存在 buffer overflow。在内存中,buffer 的分布如下图所示:
图 2. Buffer 分布
访问 x+8 将产生一个非法内存访问。对此,Dr Memory 将给出如下的错误信息:
首先用大写的单词 UNADDRESSABLE ACCESS 表明这是一个非法访问错误。接着,&reading 0xx byte(s)&表示这是一个非法读,读取的范围为 0x 到 0x,一共读了 1 个 byte。接下来的三行是调用堆栈信息,可以方便地看到错误发生在哪个源文件的哪一行(程序 t 需要在用 gcc 编译的时候给定-g 选项)。此外 DrMemory 还给出了一些辅助的错误信息。比如:
错误发生的时间:Note: elapsed time = 0:00:00.133 in thread 13971。这表明错误是程序开始的第 0.133 秒后发生的,有些情况下,人们可以根据这个时间进行辅助判断。
错误细节:Note: refers to 1 byte(s) beyond last valid byte in prior malloc。这里给出了错误的详细信息,如前所述,造成非法访问的可能很多,在本例中是 buffer overflow,因此这里的详细信息可以帮助我们了解非法访问的具体原因。
Note: prev lower malloc: 0xx。这里给出了 overflow 之前的合法内存地址,有些情况下对于查错 有一定的帮助。
Note: instruction: movzx (%eax) -& %eax。这里给出的是造成错误的具体指令。
可以看到 DrMemory 只报告了一个未初始化读错误,在第 12 行。很多其他工具对于 memcpy(&b,&a, sizeof(T))也会报错。
GCC 将自动对齐数据结构(未使用 pack 修饰符的情况下)。因此 struct T 在内存中的实际分布如下:
图 3. 内存拷贝细节
在 memcpy 时,有 3 个未初始化 byte 也被访问了,但这类错误如果也报告的话,对正常程序 DrMemory 会产生很多错误信息。这些其实不是错误,所以被称为 False Positive。类似医学名词&假阳性&。内存调试工具的一个主要目标就是减少 False Positive,否则产生的报告有用性将极大降低。
其它很多工具,遇到上述拷贝会报告 false positive,浪费读报告的人们的时间。因此这是 Dr Memory 的一个重要优点。
内存泄露是常见的内存错误,我们可能都曾经遇到过。不过 Dr.Memory 对内存泄露的定义比较独特,在程序退出之前,Dr.Memory 把所有依然被分配的内存分为三类:
Still-reachable allocation
很多程序分配了内存之后,在其整个生命周期内都不释放。虽然这是一种泄露,但实际上多数情况下这是无害的,甚至是特意这样设计的。因此 Dr.Memory 并不认为这是一种内存泄露,而称之为&Still-reachable allocation&。
有一些内存无法再被释放,因为指向该内存的指针丢失了。比如下面这个代码:
清单 5.内存 Leak 例子代码
DrMemory 称这类错误为内存泄露。因为这些内存已经没有办法被释放了。
Possible Leak
如前所述指向内存的指针被修改会被认为是一个 Leak,但并非所有的指针修改都是一个 Leak。DrMemory 利用一些经验规则(Heuristic)将以下几种指针修改列为 Possible Leak。
第一种情况:C++程序利用 new[]分配了一个数组,该数组的每个元素都是 拥有自己的析构函数的复杂数据结构。这种情况下,New 操作符为每个元素加上一个 header 用来保存数组的个数,以便 delete[]操作符知道需要调用多少个析构函数。但 new[]返回 caller 的是 header 之后的地址,这样就变成了一个 mid-allocation 指针。这可能被 Dr memory 认为是一个内存泄露。但可以使用-no_midchunk_new_ok 选项让 DrMemory 将这类错误报告为&possible leak&而非&leak&。
参考下图,理解这种情况。
图 4.mid-chunk new
从堆分配器的角度来看,buffer 的起点在 A 处,但 new 返回 B,给 Object 变量赋值。从某种角度上看,指针 A 丢失了,是一个 leak,但实际上,当调用 delete []操作符时,C++运行时库会自动将 Object 指针减 4,从而指向 A 点,再进行释放。某些编译器不使用这种做法,则没有这个问题。
第二种情况,某些 C++编译器在处理多继承时,会出现 mid-chunk 指针。很抱歉,具体细节本人也不甚了解。Dr Memory 的原文如下:it includes instances of a pointer to a class with multiple inheritance that is cast to one of the parents: it can end up pointing to the subobject representation in the middle of the allocation. 您可以用-no_midchunk_inheritance_ok 选项将这类&错误&报告为&possible leak& 。
还有一种可能:std::string 类把一个 char[]数组放置在分配空间中,并返回一个指针直接指向它,造成了一个 mid-allocation 指针。您可以用-no_midchunk_string_ok 选项让这类错误显示为&possible leak&。
一些有用的选项:
现实世界中真正的程序有很多不同于本文中所罗列的那些例子程序,现实程序更复杂,查找错误并不像例子所示的那么容易。DrMemory 设计了一些辅助选项,灵活使用它们才能在真正的工作中得到有用的信息。
监控子程序
缺省情况下 DrMemory 将监控当前进程产生的子进程的内存错误。如果您想禁止检查子进程,可以使用-no_follow_children 选项。
合并检查结果
用-aggregate 选项可以合并 DrMemory 的检查结果,比如下面的命令把 logs 目录下面多个 DrMemory 报告合并为一个总的报告。
这个功能在某些情况下比较有用。比如对同一个程序用多个不同的测试用例测出不同的内存错误,可以把多个报告合并起来,以便程序员一次阅读。
检查不退出程序
一些程序永远或者长时间都不退出,对于某些内存错误,比如未初始化读写,或者非法读写,DrMemory 一旦发现就立即写入 result 文件。但 DrMemory 只有在进程退出时才检查内存泄露。因此对于长期运行的程序,如果我们想在其运行期间得到内存泄露的报告,就需要使用 DrMemory 的 nudge 命令。比如您的进程 pid 为 1000,正在被 DrMemory 检测。那么你可以在 Shell 中运行下面这条命令,强制 DrMemory 进行内存泄露检查,并把结果更新到 result 文件中。
现在打开 result 文件,如果程序有内存泄露,您将在该文件中找到错误信息。
Suppressing Errors
内存错误检查工具的一个重要能力就是能够 suppress errors,即隐藏指定&错误&的能力。因为人们使用内存错误检测工具最希望的是它能给出&真正的&错误,而不是给出大量的不是错误的错误。工具本身可以根据一些经验算法隐藏一些&众所周知&的假错误。但更多的情况下,需要使用者告诉工具如何区分出假错误。
每次运行 DrMemory 时,它会产生一个 suppress 文件,和 result 文件放在一起。该文件的格式如下:
图 5. suppress 文件格式
suppress 文件有多个&One Error&小节组成,每个&One Error&表示一个可以被 suppress 的错误。用调用堆栈来表示,有两种格式来表示堆栈:
DrMemory 支持通配符,比如 t!*表示不报告所有模块 t 中的错误。在 Linux 下面,模块 t,就是由 t.c 生成的 t.o 所包含的代码,换句话说就是不检查 t.c 中的错误。
一些有用的选项:
现实世界中真正的程序有很多不同于本文中所罗列的那些例子程序,现实程序更复杂,查找错误并不像例子所示的那么容易。DrMemory 设计了一些辅助选项,灵活使用它们才能在真正的工作中得到有用的信息。
监控子程序
缺省情况下 DrMemory 将监控当前进程产生的子进程的内存错误。如果您想禁止检查子进程,可以使用-no_follow_children 选项。
合并检查结果
用-aggregate 选项可以合并 DrMemory 的检查结果,比如下面的命令把 logs 目录下面多个 DrMemory 报告合并为一个总的报告。
这个功能在某些情况下比较有用。比如对同一个程序用多个不同的测试用例测出不同的内存错误,可以把多个报告合并起来,以便程序员一次阅读。
检查不退出程序
一些程序永远或者长时间都不退出,对于某些内存错误,比如未初始化读写,或者非法读写,DrMemory 一旦发现就立即写入 result 文件。但 DrMemory 只有在进程退出时才检查内存泄露。因此对于长期运行的程序,如果我们想在其运行期间得到内存泄露的报告,就需要使用 DrMemory 的 nudge 命令。比如您的进程 pid 为 1000,正在被 DrMemory 检测。那么你可以在 Shell 中运行下面这条命令,强制 DrMemory 进行内存泄露检查,并把结果更新到 result 文件中。
现在打开 result 文件,如果程序有内存泄露,您将在该文件中找到错误信息。
Suppressing Errors
内存错误检查工具的一个重要能力就是能够 suppress errors,即隐藏指定&错误&的能力。因为人们使用内存错误检测工具最希望的是它能给出&真正的&错误,而不是给出大量的不是错误的错误。工具本身可以根据一些经验算法隐藏一些&众所周知&的假错误。但更多的情况下,需要使用者告诉工具如何区分出假错误。
每次运行 DrMemory 时,它会产生一个 suppress 文件,和 result 文件放在一起。该文件的格式如下:
图 5. suppress 文件格式
suppress 文件有多个&One Error&小节组成,每个&One Error&表示一个可以被 suppress 的错误。用调用堆栈来表示,有两种格式来表示堆栈:
DrMemory 支持通配符,比如 t!*表示不报告所有模块 t 中的错误。在 Linux 下面,模块 t,就是由 t.c 生成的 t.o 所包含的代码,换句话说就是不检查 t.c 中的错误。
软件特点:
Dr Memory 与 Valgrind 类似,可以直接检查已经编译好的可执行文件。用户不用改写被检查程序的源代码,也无须重新链接第三方库文件,使用起来非常方便。
易用性和性能是 DrMemory 的主要优点,此外 DrMemory 可以用于调试 Windows 程序,因此它被广泛认为是 Windows 上的 Valgrind 替代工具。在 Linux 平台中,DrMemory 也往往可以作为 Valgrind 之外的另一个选择。
DrMemory 对内存泄露的监测采用了比较独特的算法,大量减少了&false positive&,即虚假错误。如果您使用 Valgrind 等工具后仍无法找到程序中的内存错误,不妨试试 DrMemory 吧。
Dr. Memory 建立在 DynamoRIO 这个动态二进制插桩平台上。动态监测程序的运行,并对内存访问相关的执行代码进行动态修改,记录其行为,并采用先进的算法进行错误检查。
C++程序员最大的敌人就是内存处理错误,比如内存泄露、内存溢出等。这些错误不易发现,调试困难。本文介绍一个新的内存调试工具 DrMemory,为您的工具箱中添加一个新的内存检查利器吧。
&&请点击以下链接下载该软件:&Dr Memory(c++ 内存泄漏检测工具)V1.7.2 官方版
上一软件:
下一软件:
(评论内容只代表网友观点,与本站立场无关)
为了保证您快速的下载,推荐使用[] 、[] 等专业工具下载.
为确保软件能正常使用,请使用[
]解压本站软件.
目前不少软件都捆绑流氓插件,请在安装的之时务必留意每一个安装步骤.绿色先锋本身是不会捆绑任何插件在软件中的.
该软件为网上收集,若无意中侵犯了您的版权,.我们将在收信后24小时内删除侵权内
本站下载的软件中,部分软件经过压缩加密处理,解压密码为:
感谢您对绿色先锋的支持,请将网站地址放在您的博客,空间等地方,以便我们为您及您的朋友提供更好的服务.
软件按字母排列:
中文按声母搜索:Leakdiag安装
windows下内存泄漏查找工具Leakdiag使用起来还是蛮方便的。
Leakdiag下载之后按照默认设置安装,否则好像是会出问题的。
默认安装是直接装在C盘下。
那它是如何来检测内存泄漏的呢?
下图所示是Leakdiag目录,Logs文件夹里边存储的就是记录的日志,我们则是通过启动leakdiag应用程序进行检测。
第一次试验
首先测试一下常见的new和malloc作为练手。
在vs里边写了以下程序:
void testNew()
char *data = new char[100];
data[0] = 'a';
cout && data[0];
void testNewWithDelete()
char *data1 = new char[100];
data1[0] = 'b';
cout && data1[0];
delete[] data1;
data1 = NULL;
void testMalloc()
int *data2 = (int *)malloc(sizeof(int)*100);
data2[0] = 1;
cout && data2[0];
void testMallocWithFree()
int *data3 = (int *)malloc(sizeof(int)*100);
data3[0] = 2;
cout && data3[0];
free(data3);
data3 = NULL;
int main()
for (int i = 0; i & 100000; i++)
testNew();
testNewWithDelete();
testMalloc();
testMallocWithFree();
我的工程名字叫memoryTest,然后启动调试,会出现memoryTest.exe。
然后启动Leakdiag应用程序,出现下图,我们首先在application里边找到memoryTest.exe,然后在Memory allocators这里选择Heap Allocator,因为内存泄漏主要是因为程序员申请了空间忘记释放,这些内存空间都是在堆区申请,所以查看堆区就好了,然后按下start。
之后到这一幅图,我们点击Log按钮,它就开始记录了,觉得程序已经把我们要检测的部分都跑好了就可以按stop,至此操作结束。
查看Log记录
在Logs目录里边出现了刚刚记录的xml文件,我是用Notepad++来打开xml文件的。
打开xml文件以后,内容好多哦,不过我们只需要关心有
dll=”memoryTest.exe”的部分。
下面按照顺序(在新标签页打开图片会显示更加清楚):
&FRAME num="0" dll="MSVCR100.dll" function ="malloc" offset="0x36" filename="" line="" addr="0x713B0269" /&
&FRAME num="1" dll="memoryTest.exe" function ="main" offset="0x5B" filename="e:\vsworkspace\memorytest\memorytest\test.cpp" line="81" addr="0x10610BB" /&
&FRAME num="2" dll="memoryTest.exe" function ="__tmainCRTStartup" offset="0x122" filename="f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c" line="555" addr="0x1062211" /&
首先观察第一个,从下往上看,首先看frame num=2的这一行,提示函数是__tmainCRTStartup,不管它。
然后是frame num = 1的这一行,提示函数是main,说明问题出在main函数里边,接着又line = “81”,说明问题出在第81行。
然后再往上一行,frame num = 0这一行,提示函数是malloc,说明是malloc带来的问题。
&FRAME num="0" dll="MSVCR100.dll" function ="malloc" offset="0x36" filename="" line="" addr="0x713B0269" /&
&FRAME num="1" dll="MSVCR100.dll" function ="operator new" offset="0x10" filename="" line="" addr="0x713B233B" /&
&FRAME num="2" dll="memoryTest.exe" function ="main" offset="0x27" filename="e:\vsworkspace\memorytest\memorytest\test.cpp" line="79" addr="0x1061087" /&
这一段便是说在main的79行里边使用了new,而在frame=0这里居然有malloc,说明new的实现也是依靠了malloc哦!
我们回过头来看看main函数,出问题的地方在79行和81行,正好对了是吧!
上面示例正确地指出了出现问题的地方,但是使用不当就会出问题的。
首先是代码上的问题,我是按照以下顺序写代码的。
1.申请空间
2.对空间进行赋值
3.使用空间中的某个值
4.释放空间(如果有的话)
经过实验发现如果去掉了第3个步骤,也就是使用空间的值,在我这里便是cout,那么结果就会出问题,不论有没有步骤2,最终结果都如下,提示在80和82行出了问题,
( ?? ??`),这样找出的结果就完全搓掉了呢,所以一定要使用了未释放的空间,它才能正确找到位置!赋值不算是使用哦!
&FRAME num="0" dll="MSVCR100.dll" function ="malloc" offset="0x36" filename="" line="" addr="0x" /&
&FRAME num="1" dll="MSVCR100.dll" function ="operator new" offset="0x10" filename="" line="" addr="0x7135233B" /&
&FRAME num="2" dll="memoryTest.exe" function ="main" offset="0x27" filename="e:\vsworkspace\memorytest\memorytest\test.cpp" line="80" addr="0x361087" /&
&FRAME num="0" dll="MSVCR100.dll" function ="malloc" offset="0x36" filename="" line="" addr="0x" /&
&FRAME num="1" dll="memoryTest.exe" function ="main" offset="0x3E" filename="e:\vsworkspace\memorytest\memorytest\test.cpp" line="82" addr="0x36109E" /&
&FRAME num="2" dll="memoryTest.exe" function ="__tmainCRTStartup" offset="0x122" filename="f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c" line="555" addr="0x361FD1" /&
函数里边or直接放在main里边
我在示例里边都是将测试代码放在函数里边,在main函数里边对这些函数进行调用。如果我直接将这些代码放到main函数里边呢?
代码如下:
int main()
for (int i = 0; i & ; i++)
char *data = new char[100];
cout && data[0];
char *data1 = new char[100];
cout && data1[0];
delete[] data1;
data1 = NULL;
int *data2 = (int *)malloc(sizeof(int)*100);
cout && data2[0];
int *data3 = (int *)malloc(sizeof(int)*100);
cout && data3[0];
free(data3);
data3 = NULL;
得到的记录如下:
&FRAME num="0" dll="MSVCR100.dll" function ="malloc" offset="0x36" filename="" line="" addr="0x" /&
&FRAME num="1" dll="memoryTest.exe" function ="main" offset="0x62" filename="e:\vsworkspace\memorytest\memorytest\test.cpp" line="90" addr="0xE910C2" /&
&FRAME num="2" dll="memoryTest.exe" function ="__tmainCRTStartup" offset="0x122" filename="f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c" line="555" addr="0xE92211" /&
&FRAME num="3" dll="kernel32.dll" function ="BaseThreadInitThunk" offset="0x12" filename="" line="" addr="0x760E1174" /&
&FRAME num="4" dll="ntdll.dll" function ="RtlInitializeExceptionChain" offset="0x63" filename="" line="" addr="0x77A7B3F5" /&
&STACKID&003B42A8&/STACKID&
&STACK numallocs="0753" size="0100" totalsize="075300"&
&STACKSTATS&
&SIZESTAT size="0100" numallocs="0753"/&
&HEAPSTAT handle="460000" numallocs="0753"/&
&/STACKSTATS&
&FRAME num="0" dll="MSVCR100.dll" function ="malloc" offset="0x36" filename="" line="" addr="0x" /&
&FRAME num="1" dll="MSVCR100.dll" function ="operator new" offset="0x10" filename="" line="" addr="0x7135233B" /&
&FRAME num="2" dll="memoryTest.exe" function ="main" offset="0x27" filename="e:\vsworkspace\memorytest\memorytest\test.cpp" line="81" addr="0xE91087" /&
&FRAME num="3" dll="memoryTest.exe" function ="__tmainCRTStartup" offset="0x122" filename="f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c" line="555" addr="0xE92211" /&
&FRAME num="4" dll="kernel32.dll" function ="BaseThreadInitThunk" offset="0x12" filename="" line="" addr="0x760E1174" /&
记录显示在第90行出现malloc问题,第81行出现了new问题,正好找对了!
如果我把赋值语句加上,去掉赋值语句的注释,那么提示我在第90行出现malloc问题,第79和82行出现了new问题, (*゜ロ゜)ノ ,这个这个,找多了啊!!我又试了一次,这次按了log之后让它多跑了一段时间,还是这个样子。╮(╯▽╰)╭,这就是main里边跑的问题了,虽然它能更加准确地告诉我们问题发生在哪里,不过经常会误报,不过也不算大问题,误报的地方很容易就能被我们给发现啦。
LeakDiag的使用注意
这里也有一个严格的顺序:
1.启动vs程序
2.启动LeakDiag程序,在里边找到vs启动的这个程序
3.选择Heap Allocator,此时start亮了,点击它
4.过会点击Log按钮
5.稍等片刻点击stop按钮,关掉LeakDiag
6.结束vs程序
如果在点stop之前结束了vs程序,那么stop会按不下去。
如果首先启动LeakDiag,那么会找不到vs启动的程序
注意LeakDiag是按照进程PID来定位程序的,我每次启动vs得到的程序它的PID是不同的,所以必须要在vs启动之后再启动LeakDiag才能找到正确的vs程序。
我遇到过的内存泄漏情况
首先是类里边的:
1.类的动态对象
我简单地定义了如下的类
class MyClass
map&int, string& myM
myMap[0] = "abc";
myMap[2] = "def";
~MyClass(){};
void fun()
map&int, string&::
it = myMap.find(0);
if (it != myMap.end())
cout && it-&second.c_str() &&
之后我测试了如下代码:
MyClass *myclass1 = new MyClass();
myclass1-&fun();
delete myclass1;
myclass1 = NULL;
提示我因为function =”operator new”导致内存泄漏。
●▂●什么鬼啊,我明明写了delete的啊,而且delete也会自动调用myclass类的析构函数,可为什么还是会报错呢?这个我真是没想到原因也不知道该怎么解决了,好奇怪啊。不知道是不是误报。
2.类里边的stl-map
依然是上边那个类的测试,提示因为map产生了内容泄漏。
function ="operator new"
function ="std___Tree_val..."
function ="std__map..."
如果直接在函数里边使用map是不会出现这个问题的,但是在类里边使用它就出现了这个问题。
这个问题我找到的解决办法就是在类的析构函数里边加上一句话:
myMap.clear()
如果是在类里边使用vector,那是没有问题的,这应该是因为vector和map申请新空间的方式不同引起的。
类里边的问题暂时就这么多了,下面记录下在opencv里边的问题。
1.IplImage的create
IplImage创建图像如果不主动释放是肯定会内存泄漏的,不过我挺好奇的是它load图像不知道会不会也有问题,所以对以下代码进行了测试。
IplImage* src = cvLoadImage("E:/1.jpg");
IplImage* temp = cvCreateImage( cvSize( 10, 10 ), src-&depth, src-&nChannels );
IplImage* temp1 = cvCreateImage( cvSize( 10, 10 ), src-&depth, src-&nChannels );
cvReleaseImage(&temp1);
第一个载入图片没问题,记录中关于load图像有下面这一段记录,从中可以看到这个cvLoadImage函数的调用顺序,最后还是依靠了malloc,不过这一段并没有dll=”memoryTest.exe”,说明在我们的程序里边它是不引起内存泄漏的。
第二句引起了问题,问题描述如下
解决办法便是第三句里边的加上cvReleaseImage。
一般来说使用了IplImage *的图像都要配套使用一个cvReleaseImage,所以我这里的载入图片也应该加上的。
2.Mat参数传递
我对Mat的载入图片,创建图片以及引用参数创建图片进行测试。
void matInFun(Mat &result){
result = Mat(100, 100,CV_8U,cv(0));
void matInFun2(Mat result){
result = Mat(100, 100,CV_8U,cv(0));
Mat matA, matB, matC;
matInFun(matA);
matInFun2(matB);
matInFun(matC);
matC.release();
Mat srcMat = imread("E:/1.jpg");
上面的代码在matInFun(matA)这一句上报错了,具体错误如下:
Mat的载入图片以及普通情况下的创建图片都是没有问题的,不过作为引用参数在函数里边创建图片的时候则会出现问题。
解决办法:使用完用引用创建的Mat之后,调用release()函数即可。
3.HoG特征的使用
HoG特征需要用到HOGDescriptor类,但是这个类申请之后该如何释放呢?
void testImage0()
HOGDescriptor *hog=new HOGDescriptor(cvSize(128,32),cvSize(16,16),cvSize(8,8),cvSize(8,8),9);
void testImage1()
Mat test = imread("E:/1.jpg");
resize(test,test,Size(128,32),0,0,CV_INTER_LINEAR);
HOGDescriptor *hog=new HOGDescriptor(cvSize(128,32),cvSize(16,16),cvSize(8,8),cvSize(8,8),9);
vector&float&
hog-&compute(test, descriptors,Size(1,1), Size(0,0));
cout&&"HOG dims: "&&descriptors.size()&&
hog-&~HOGDescriptor();
void testImageBad()
Mat test = imread("E:/1.jpg");
resize(test,test,Size(128,32),0,0,CV_INTER_LINEAR);
HOGDescriptor *hog=new HOGDescriptor(cvSize(128,32),cvSize(16,16),cvSize(8,8),cvSize(8,8),9);
vector&float&
hog-&compute(test, descriptors,Size(1,1), Size(0,0));
cout&&"HOG dims: "&&descriptors.size()&&
hog = NULL;
测试结果挺匪夷所思,
如果我是这样测试的
int main()
testImage1();
int main()
testImageBad();
那么都不会报错。
但是如果我是这样写
下面报的错是在83行,也就是testImageBad函数,但是紧接着上一行的解释居然是function =”testImage1”,(#‵′)靠,什么奇怪的结果啊。
所以我觉得最好的解决办法就是把所有的都写一下:
先调用析构,然后delete,最好赋值为NULL,这样就肯定不会出错了。
本文已收录于以下专栏:
相关文章推荐
在 Windows 系统下运行程序的Debug版,可以通过任务管理器看出程序是否有内存泄漏。
演示程序的代码:
// #include
#define _...
利用任务管理器的虚拟内存和句柄项,查看内存泄漏之Win7。
对于内存泄漏的检查,本质上在于定位内存泄漏。这种定位包含两层含义:
一是定位模块,即哪个模块出了问题。
二是定位代码,即找到造成内存泄漏的代码。
对此,在分工合作完成一个系统的背景下,我们检查内...
一.内存泄漏的定义
  一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显示释放的内存。应用程序一般使用malloc...
LeakDiag是微软一款检测memory leak的工具
安装默认是在c:\leakdiag下,完成后界面如下:
写如下的测试程序进行测试
&stdafx...
LeakDiag是微软一款检测memory leak的工具,使用比较简单
首先去下载一个/PSS/Tools/Developer%20Support...
    LeakDiag版本1.25的下载地址为:
http://iterzebra.download.csdn.net/
    微软官方地址:
     ft...
打开leakdiag的安装目录,把原来的东西删掉,改为下面内容。(“ ; ”符号的含义是注释,相当于C语言里的“ // ”)
[DLPlayer.exe]
;AutoStart entries
LeakDiag是微软一款检测memory leak的工具,使用比较简单
首先去下载一个/PSS/Tools/Developer%20Support...
    LeakDiag版本1.25的下载地址为:
http://iterzebra.download.csdn.net/
    微软官方地址:
     ft...
他的最新文章
讲师:王哲涵
讲师:韦玮
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 js内存泄露检测工具 的文章

 

随机推荐