【问题标题】:memory-allocation breakpoint does not stop execution内存分配断点不会停止执行
【发布时间】:2011-10-20 13:32:20
【问题描述】:

我有一段 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;

希望这对某人有用。

【问题讨论】:

标签: c++ memory-leaks breakpoints


【解决方案1】:

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

【讨论】:

  • 如果 _crtBreakAlloc 然后在调试器中报告了一些东西会很好;很容易抓住。有 _crtGetBreaAlloc() 吗? (我应该谷歌,我知道)
猜你喜欢
  • 2013-10-15
  • 2012-11-29
  • 1970-01-01
  • 2013-07-20
  • 2019-04-29
  • 2012-07-15
  • 2011-05-22
  • 2011-04-30
  • 1970-01-01
相关资源
最近更新 更多