为什么删除内存不可用?C++

0xC*_*ACE 1 c++ memory-management tinyxml

我有一个200 MB的 XML文件,我正在使用TinyXML加载.我的问题是,当TinyXML对象被销毁时,它使用的内存将不会被重用.我使用过我在其他项目中使用的内存泄漏检测器,并且已经手动逐步执行代码并且无法找到任何内存泄漏,因此我不怀疑泄漏的内存是问题所在.

此代码将重现该问题:

#include <iostream>
#include <tinyxml.h>

int main()
{
    char* filename = "../LargeFile.xml";

    {
        TiXmlDocument targetDoc( filename );
        targetDoc.LoadFile();
    }

    char* buf = new char[ 524288000 ];
    delete [] buf;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用地址空间监视器我可以看到,在LoadFile()有一大块红色后,然后targetDoc被破坏后它全部变黄.然后,当分配最终的char buf时,它显示为红色,但是在绿色空间的顶部,而不是从TinyXML中释放的黄色.如果尝试分配比绿色地址空间更多的缓冲区,应用程序将崩溃(内存不足).这可以在下面的图像中看到.

加载后 卸载后 Char缓冲区分配

根据地址空间监视器页面"自由地址空间以绿色显示,保留地址以黄色显示,已使用(已提交)内存区域以红色显示"因此,根据地址空间监视器,为什么TinyXML释放的内存保持"保留"状态.什么可能导致这种情况发生,我该如何阻止它?

编辑:

"你在分配大缓冲区吗?如果是这样,那么黄色空间中可能存在内存碎片,并且无法分配大的连续缓冲区"

但是很好的问题表明TinyXML存在内存泄漏,我的工具都没有显示出来.

UPDATE

我做了循环,无休止地分配整数,最终似乎使用了所有的黄色空间.但是,更大的分配不使用它.这向我表明,在通过tinyXML解析xml文件期间,堆中出现了一些小漏洞,这些漏洞以一种方式对堆进行分段,使得只有小到足以容纳漏洞的对象才能在黄色空间中分配.所以我在TinyXML中搜索越来越长的漏洞,但仍未找到任何漏洞.一切似乎都得到了正确的释放,这让我回到了最初的困惑状态.

我无法解释这个问题.

Char缓冲区分配 Char Buffer Allocation2 Char Buffer Allocation3

Eme*_*ger 6

你真的看到任何其他记忆问题的迹象吗?保留存储器表示从OS保留地址范围,但实际上没有物理存储器在使用.没什么值得担心的.当您下次需要内存时,它将首先来自该预留空间.