C++:使用std :: map进行微小的内存泄漏

Bil*_*ias 1 c++ memory memory-leaks

我正在编写一个自定义文本文件 - 数据解析器(类似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
Run Code Online (Sandbox Code Playgroud)

我设法将"违规"代码行缩小到这个范围:

classDefinitions[FastStr(cString)] = classDef;
Run Code Online (Sandbox Code Playgroud)

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

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

现在抓住了:

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

这让我怀疑std :: map中存在内存泄漏; 但它也可能是我的错误...我很确定这是违规行,因为如果我之前停止解析,就没有内存泄漏; 还有就是内存泄漏,如果我只是停止解析后,这条线.

任何人都可以评论这个吗?

小智 10

泄漏报告中的"{290}"是泄漏的内存块的内存分配的序列号.如果此序列号始终相同,则可以使用_crtBreakAlloc在命中分配序列号时导致调试器中断.从堆栈跟踪中,您可以找到此块的分配位置.一旦你知道它被分配到哪里,为什么目的,它往往很容易确定为什么它没有被解除分配.

阅读Debug Heap文档以了解_crtBreakAlloc.