c++ - 为什么删除的内存无法使用? C++

标签 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;
}

使用 Address Space Monitor我可以看到在 LoadFile() 之后有一大块红色,然后在 targetDoc 被销毁之后它就全是黄色了。然后,当最终的 char buf 被分配时,它显示为红色但在绿色空间的顶部,而不是从 TinyXML 中释放出来的黄色。如果尝试分配比绿色地址空间更多的缓冲区,应用程序将崩溃(内存不足)。这可以在下面的图片中看到。

After Load After Unload Char Buffer Allocation

根据地址空间监控页面“空闲地址空间显示为绿色,保留地址显示为黄色,使用(已提交)内存区域显示为红色” 那么为什么 TinyXML 释放的内存是根据地址空间监视器保持“保留”。什么会导致这种情况发生,我该如何阻止它?

编辑:

“你在分配大缓冲区吗?如果是这样,那么黄色空间中可能存在内存碎片,没有地方可以分配大的连续缓冲区”

很好的问题,但这表明 TinyXML 存在内存泄漏,而我的所有工具都没有显示存在内存泄漏。

更新

我制作了无限分配整数的循环,最终似乎用完了所有黄色空间。然而,更大的分配不使用它。这向我表明,在 tinyXML 解析 xml 文件的过程中,堆中出现了一些小的泄漏,这使得堆碎片化,只有小到足以容纳泄漏之间的对象才能在黄色空间中分配.所以我在 TinyXML 中搜索了更长时间和更努力的泄漏,但仍然没有找到任何泄漏。一切似乎都得到了正确的释放,这让我回到了最初的困惑状态。

我无法解释这个问题。

Char Buffer Allocation Char Buffer Allocation2 Char Buffer Allocation3

最佳答案

您是否真的看到任何其他内存问题迹象? Reserved memory 表示该地址范围是从操作系统保留的,但没有实际使用的物理内存。没什么好担心的。当您下次需要内存时,它将首先来自该保留空间。

关于c++ - 为什么删除的内存无法使用? C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5399921/

相关文章:

c++ - TinyXML 在最后位置插入。

c++ - 如何将编码从 C 转换为 C++?

c++ - 将最近查看或打开的文件夹保存到日志文件

使用列表类和 push_back 的 C++ 内存泄漏

r - 将对象传递给函数而不在更改时复制它

c++ - 将具有多个值的 XML 属性加载到不同的表格单元格

c++ - 如何在 C++ 中为 cin.ignore() 指定多个分隔符?

c++ - Range-for-loops 和 std::vector<bool>

c++ - 覆盖率问题:sprintf语句上重叠内存的拷贝(OVERLAPPING_COPY)

c++ - TinyXML2 C++ - 从旧的/格式不正确的 XML 文件中提取特定数据