gpt4 book ai didi

c - malloc 和 free 的不同行为?

转载 作者:太空宇宙 更新时间:2023-11-04 01:49:40 26 4
gpt4 key购买 nike

我有一个用 C++ 实现的树。

当我运行创建树的代码并使用 ma​​lloc() 插入大约 5,000,000 个 int 键时,它将占用 200MB(如 所示任务管理器),当我使用 Visual Studio 2013 运行时。

当我在每个节点上使用 free() 释放树时,它将返回到大约 0.5MB。到目前为止一切正常。

现在,当我使用 cygwin 编译并运行 Visual Studio 时,树的大小变成了 80MB(这没问题,因为 visual studio 添加了调试信息和其他内容), 但是当我释放树时,它的大小没有任何变化!!!

简而言之:在 Visual Studio 中运行时,释放树会将程序的大小返回到原始大小 0.5MB,但是当我在 Visual Studio 外部(使用 cygwin)编译并运行相同的代码时,然后释放程序的大小仍然是 80MB,树没有改变任何东西。

那么为什么会这样呢?

更新

释放树后,我尝试再次在树中插入相同的 5,000,000 个 int 键。在 cygwin 的情况下,它没有使用额外的内存,即相同的 80MB,这意味着正如反馈指出的那样(感谢大家 +1)内存被释放但没有返回给操作系统。

现在的问题是:如果我在内存中分配了大量内存,那么在释放时我不希望将释放的区域保留在程序中。那么我怎样才能强制 cygwin 将它返回给操作系统呢?

最佳答案

不同的 mallocs 表现不同。 Microsoft 可能会使用原始堆来分配和释放项目。

似乎 MS 正在使用直接原始堆 (HeapAlloc/HeapFree) 上的内存。

但是 cygwin 使用的是本地托管内存系统。

这意味着通过 HeapAlloc/HeapFree 释放会将内存返回给操作系统,并释放相关资源。

在 cygwin 上调用 free,将返回内存以供重新使用,但不会将其返回给操作系统。

管理大量内存

如果您有大量内存需要处理,那么您最好直接管理它们,方法是与操作系统交互并调用其原始函数。例如,在 Windows 上,您可以调用 HeapCreate 来创建一个单独的堆,并使用 HeapAlloc 在该单独的大块分配中进行分配,然后使用 HeapFree 释放它们。

当您完成 block 时,可以使用 HeapDestroy 释放所有内存。

关于c - malloc 和 free 的不同行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46512510/

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