我有一段带有内存泄漏的JNI代码:
Detected memory leaks!
Dumping objects ->
{76} normal block at 0x277522F8, 52 bytes long.
Data: < "u' "u' "u' > F8 22 75 27 F8 22 75 27 F8 22 75 27 CD CD CD CD
Object dump complete.
因此,我在指定的内存分配编号上设置断点(在本例中为76)。
_crtBreakAlloc = 76;
但应用程序永远不会停止执行,就好像从未执行过分配一样。
我还在程序的开头和结尾处拍了两张内存快照,并对它们进行了比较。
(代码开头):
_CrtMemCheckpoint( &s1 );
(代码结束时):
_CrtMemCheckpoint( &s2 );
_CrtMemState s3;
_CrtMemDifference( &s3, &s1, &s2);
_CrtMemDumpStatistics( &s3 );
结果如下:
0 bytes in 0 Free Blocks.
0 bytes in 0 Normal Blocks.
0 bytes in 0 CRT Blocks.
0 bytes in 0 Ignore Blocks.
0 bytes in 0 Client Blocks.
Largest number used: 2839 bytes.
Total allocations: 101483 bytes.
似乎一切都好。
我无法弄清楚发生了什么。这是一个假阳性内存漏洞吗?或者是JVM的memleak?如果是这样,有没有办法检测它?
找到解决方案后添加:
我修改了静态map
的初始化,问题已经解决了。
特别是,我将私有静态成员从map
转换为map*
。问题是,初始化静态时,必须使用常量初始化。
以下是我如何更改静态成员的声明:
static const map<wstring, enumValue>* mapParamNames;
所以我的initialize()
方法变为:
map<wstring, paramNames>* m = new map<wstring, paramNames>();
(*m)[L"detectCaptions"] = detectCaptions;
(*m)[L"insertEmptyParagraphsForBigInterlines"] = insertEmptyParagraphsForBigInterlines;
(*m)[L"fastMode"] = fastMode;
(*m)[L"predefinedTextLanguage"] = predefinedTextLanguage;
(*m)[L"detectFontSize"] = detectFontSize;
(*m)[L"saveCharacterRecognitionVariants"] = saveCharacterRecognitionVariants;
(*m)[L"detectBold"] = detectBold;
(*m)[L"saveWordRecognitionVariants"] = saveWordRecognitionVariants;
KernelParamsSetter::mapParamNames = m;
最后,我在类析构函数中插入了地图的delete
:
delete KernelParamsSetter::mapParamNames;
希望这对某人有用。
答案 0 :(得分:2)
一种可能性是在全局变量的静态初始化期间发生存储器分配76。在这种情况下,您可能设置_crtBreakAlloc太晚以至于无法捕获分配。