内存分配断点不会停止执行

memory-allocation breakpoint does not stop execution

本文关键字:执行 分配 断点 内存      更新时间:2023-10-16

我有一段内存泄漏的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的内存泄漏?如果有,有办法检测吗?

找到解决方案后添加:

我修改了一个静态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;

一种可能是内存分配76发生在全局变量的静态初始化期间。在这种情况下,您可能设置_crtBreakAlloc太晚,无法捕获分配。