内存分配断点不会停止执行
memory-allocation breakpoint does not stop execution
我有一段内存泄漏的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太晚,无法捕获分配。
相关文章:
- 以下代码执行哪种内存分配(动态或静态)?
- C++将一个指针分配给另一个指针时执行的类型检查
- 释放动态分配的内存时是否需要执行此额外步骤
- 为什么在 C++ 执行删除操作后仍可以访问释放的动态分配的内存
- 在标准输出中执行打印会导致数组中随机分配值
- 为什么在执行增量操作之前分配指针值
- 有没有办法获得功能大小并分配内存以复制和执行
- C++标准库中是否有保证不执行动态内存分配的函数或类
- 如何仅使用添加和分配执行乘法
- 在执行中脱离堆栈对象的范围之前,请分配堆栈对象
- 如何分配可执行的内存缓冲区
- 如何直接从分配的内存中执行mmaped二进制文件/代码
- 如何制作进程以及它们执行不同的分配任务,例如使用fork读取文件或写入文件
- c++:执行动态分配的新运算符检查内存安全性
- 如何在C++中通过将每个命令分配给线程来同时执行linux系统命令
- 如何在 Linux 下为可执行文件分配堆栈
- C++ 如何在矢量指针上执行项分配
- OpenMP将函数的执行分配给线程
- 我可以在两个istream_iterators之间执行分配操作吗?
- c++程序在执行分配内存的函数时崩溃