如何在使用 JNI 的 C++/Java 项目中使用 CRT 中的工具检测内存泄漏?

Posted

技术标签:

【中文标题】如何在使用 JNI 的 C++/Java 项目中使用 CRT 中的工具检测内存泄漏?【英文标题】:How do I detect memory leaks using the tools in CRT in a C++/Java project using JNI? 【发布时间】:2012-03-15 03:09:01 【问题描述】:

我已经尝试了几个小时才能让它工作。到目前为止,它确实发现了内存泄漏,但它发现了很多,我不确定这是否现实。另外我想看看文件和行号(我知道这是可能的,但我不能让它工作),这样我就可以真正解决内存泄漏。

我已经添加了代码以在一个经常调用的方法中转储内存泄漏(通常每秒大约 60 次),我不确定它是否可以,但因为我真的没有“主要”函数很难决定把代码放在哪里。

这是我添加的内容:

// This part is in the includes part of the file
#define _CRTDBG_MAPALLOC
#define _CRTDBG_MAP_ALLOC_NEW
#include <stdlib.h>
#include <crtdbg.h>

#ifdef _DEBUG
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define new DEBUG_NEW
#endif

// This part is in the method
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
_CrtDumpMemoryLeaks();

感谢您的帮助!

【问题讨论】:

尝试 deleaker 或类似的调试器 - 它有助于控制内存泄漏和用户对象...它会指示定位错误的行。 问题是我的文件是一个 .jar 文件,而 deleaker 只接受一个 .exe。你知道任何类似的工具可以与通过 JNI 调用 C++ 代码的 Java 程序一起工作吗?谢谢。 当您一直调用 _CrtDumpMemoryLeaks() 时,每次分配都是泄漏。考虑使用 DllMain() 作为一个好的触发器。 【参考方案1】:

试试

视觉检漏仪

http://www.codeproject.com/Articles/9815/Visual-Leak-Detector-Enhanced-Memory-Leak-Detectio

我用它取得了很好的效果。

【讨论】:

【参考方案2】:

使用 crt,您可以在执行操作之前和之后比较内存状态。为了实现这一点,只需在单元测试中使用 _CrtMemDifference。这个概念是编写单元测试,它将调用代码的不同部分,并在使用 _CrtMemCheckpoint 之前和调用之后获取应用程序内存的状态。因此,之后您必须将两个检查点与 _CrtMemDifference 进行比较。

【讨论】:

以上是关于如何在使用 JNI 的 C++/Java 项目中使用 CRT 中的工具检测内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章

使用JNI时,Qt在哪里查找java类

如何使用 JNI 将 Java ByteBuffer 发送到 C?

使用 JNI 在 C 中访问 Java 对象中的 Java 对象

如何使用JNI管理C ++代码中的静态变量?

Windows下JNI的使用教程

如何使用 JNI 从本机 c 库将 double 和 unsigned int 返回到 java