gpt4 book ai didi

C++:std::map的微小内存泄漏

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:04:25 25 4
gpt4 key购买 nike

我正在编写自定义文本文件数据解析器(类似 JSON),我花了很多时间试图在其中找到微小的内存泄漏。

我正在使用 VC++2008 和命令 _CrtMemCheckpoint_CrtDumpMemoryLeaks检查内存泄漏。

当我解析任何文件然后将其从内存中删除时(连同任何其他声明的内存),我得到一个 16 字节的内存泄漏,如下所示:

{290} normal block at 0x00486AF0, 16 bytes long.
Data: < H `aH hH eH > C0 9A 48 00 60 61 48 00 18 68 48 00 D8 65 48 00

我已经设法将“有问题”的代码行缩小为:

classDefinitions[FastStr(cString)] = classDef;

classDefinitions 是一个 std::map<FastStr, FSLClassDefinition*>并且是我的解析器类的私有(private)成员。

FastStr 是一个简单的 char* “包装器”,允许将简单的 c 字符串作为键值;它没有内存泄漏(没有"new"命令)。 'FSLClassDefinition*' 显然是一个简单的类指针,所以也没什么奇怪的。

现在是问题所在:

  1. 这一行在解析过程中执行了很多次,但我只泄漏了一个 16 字节的 block 。
  2. 如果我解析另一个文件,不会再有 16 字节的内存泄漏
  3. 如果我从内存中删除解析器(通过将其放在 {} 代码块中),然后在另一个代码块中重新创建它并让它解析另一个文件,那么我会得到一个第二个 16 字节内存泄漏。

这使我怀疑 std::map 中存在内存泄漏;但这也可能是我的错误......我很确定那是有问题的行,因为如果我停止解析 before ,就不会发生内存泄漏;如果我在这一行之后停止解析,内存泄漏。

有人可以对此发表评论吗?

最佳答案

泄漏报告中的“{290}”是泄漏的内存块的内存分配序号。如果此序列号始终相同,您可以使用 _crtBreakAlloc 在命中该分配序列号时在调试器中造成中断。从堆栈跟踪中,您可以找出该 block 的分配位置。一旦您知道它被分配到哪里以及出于什么目的,就很容易确定它没有被释放的原因。

阅读调试堆文档以了解_crtBreakAlloc

关于C++:std::map的微小内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1379564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com