Memory D/Tango中的malloc和free不释放内存?

Memory D/Tango中的malloc和free不释放内存?,memory,d,tango,Memory,D,Tango,下面是windows中的一个简单d/tango代码: module d_test.d; import tango.util.log.Trace; import tango.core.Thread; import tango.stdc.stdlib : malloc, free; void main() { Trace.formatln("Checking in..."); Thread.sleep(10); int total_n = (100 * 1000 *

下面是windows中的一个简单d/tango代码:

module d_test.d;

import tango.util.log.Trace;
import tango.core.Thread;
import tango.stdc.stdlib : malloc, free;

void main() {

    Trace.formatln("Checking in...");
    Thread.sleep(10);

    int total_n = (100 * 1000 * 1000) / int.sizeof; // fill mem with 100MB of ints
    int* armageddon = cast(int*)malloc(total_n * int.sizeof);

    for(int i = 0; i < total_n; ++i) {
        armageddon[i] = 5;
    }

    Trace.formatln("Checking in...");
    Thread.sleep(10);

    free(armageddon);
    armageddon = null;

    Trace.formatln("Checking in...");
    Thread.sleep(10);


}
模块d_test.d;
导入tango.util.log.Trace;
导入tango.core.Thread;
导入tango.stdc.stdlib:malloc,免费;
void main(){
Trace.formatln(“签入…”);
睡眠(10);
int total_n=(100*1000*1000)/int.sizeof;//用100MB的整数填充mem
int*armageddon=cast(int*)malloc(total_n*int.sizeof);
对于(int i=0;i
当我运行该程序时,内存保持在~2MB的低位,当我为指针分配一个100MB的数组时,内存使用量跳到~100MB,这很好。但是,在程序结束之前,可用内存(我正在查看任务管理器)仍为100MB

我认为它可能是Windows PuffFILE缓存或其他东西,所以我尝试了一个简单的C++程序:

#include <iostream>
#include <windows.h>

using namespace std;

int main() {

  Cout << "Checking in..." <<< endl;
  Sleep(10000);


  int total_n = (100 * 1000 * 1000) / sizeof(int);
  int* armageddon = (int*)malloc(total_n * sizeof(int));

  for(int i = 0; i < total_n; ++i) {
    armageddon[i] = 5;
  }

  Cout << "Checking in..." <<< endl;
  Sleep(10000);

  free(armageddon);
  armageddon = NULL;

  Cout << "Checking in..." <<< endl;
  Sleep(10000);


return 0;
}
#包括
#包括
使用名称空间std;
int main(){
Cout当你用“free”释放内存时,很可能它实际上并没有释放内存


可能只是简单地将其标记为空闲,但在以后请求更多内存时保留它。如果出于某种原因,系统开始运行时内存不足,则运行时可能会在此时释放它。

您可以从查看_heapmin().free()开始不会将未使用的堆返回到操作系统,它只将堆标记为空闲,并与最近的空闲邻居合并。

这将取决于空闲的实现方式。对于一些有趣的阅读,请看一看,它试图有效地管理可以跨大范围大小的内存请求。他主要关心的是malloc和免费电话必须快速、准确


但他确实提到了将内存返回操作系统的问题,并讨论了什么阻碍了它(内存碎片化)以及什么有助于它(使用mmap,或者以一种不太灵活的方式,sbrk)阅读本文后,您将更清楚地了解导致操作系统很少返回内存的折衷方法。

这很奇怪。从Tango源代码来看,malloc/free in Tango.stdc.stdlib只是C标准库函数,因此应该没有什么区别——事实上,当我使用Phobos尝试它时在Linux下,std.c.stdlib的内存会按其应有的方式返回

你确定你测量的是对的吗

附言:你可以做末日决战[0..total_n]=5


PS2:我在Linux下尝试了你的Tango代码,它按预期运行。看起来像是Windows的问题。

这只是意味着Digital Mars的malloc and free实现不会将内存返回到操作系统,即使你分配了这么大的内存块。你可以试着使用malloc and free from msvcrt.dll,也许他们会释放内存奥里


或者,如果这个问题只存在于Windows上的DMD,您可以直接使用Windows API。最简单的方法是使用HeapAlloc和HeapFree函数,但我不知道它们是否也能满足您的需要。一个确定的方法是更低级的VirtualAlloc和VirtualFree,它们直接从操作系统分配,而不是首先创建堆。这些E还包括HeAPoLoc、Maloc、C++中的新函数等,最终在使用它们时请求使用内存。< /P> OK,如果是真的,那么你知道如何通过强制释放它吗?为什么你需要它返回OS?只要你有交换空间,有未使用的数据空间大约只有零成本。@ BCS我正在监视我的程序进程。ss内存使用情况用于分析目的,因为我想在需要时限制使用的内存总量。我也很好奇为什么这样做,我怎么能按我想的方式来做。@Keyframe您想监视malloc’ed内存而不是GC分配的内存?因为GC有统计信息。。。(我知道有些用例需要避免GC。)@larsivi没错,我计划在我正在玩的游戏中很少使用GC内存,如果有的话。我有一个可以跟踪内存使用并限制内存使用的系统。malloc和free只是C调用的说唱歌手。我不知道为什么结果会不同。哟哟!//我的名字叫malloc,我是一个糟糕的说唱歌手。//给我所有的You'mem'ry,我会扔的在CRAPPARTO中,你可以用DMC(数字MAR+C++编译器)作为IIRC来尝试C++程序,它使用相同的Maloc作为D。