百度了一下还是了解,有没通俗点的解释下这个是拿来干嘛的,我知道他是分配内存的,什么时候该拿他来分配?

解决方案 »

  1.   

    需要时用,不要为用而用。例如:
    procedure Test;
    var
      p: Pointer;
    begin
      GetMem(p, 100 * 1024 *1024);//分配100MB
      DoSomething(p);
      FreeMem(p); //释放内存,如果不释放就会导致内存被遗弃(通常的现象叫做内存泄露)
    end;在很多时候可以用如下的替代方案:
    procedure Test;
    var
      b: array of byte;
    begin
      SetLength(b, 100 * 1024 *1024);//分配100MB
      DoSomething(@b[0]);
      SetLength(b, 0); //释放内存,如果这个忘记了也没有关系,这个过程(Test)执行完之后会自动被释放
    end;
      

  2.   

    var
      buffer: PChar;
      buffer2: array[0..99] of char;
    begin
      //分配堆上的内存,好处是可以控制何时释放掉内存
      GetMem(buffer, 100);
      try
        GetWindowsDirectory(buffer, 100);
        ShowMessage(buffer);
      finally
        FreeMem(buffer);
      end;  //分配栈上的内存,函数结束时自动释放
      GetWindowsDirectory(buffer2, 100);
      ShowMessage(buffer2);
    end;
      

  3.   

    还有对于记录指针,最好用New和Dispose来代替GetMem和FreeMem。比如:
    type
      PRec = ^TRec;
      TRec = record
        S: string;
        I: Integer;
      end;使用:
    var
      P: PRec;
    begin
      New(P);
      try
        P^.S := 'abc';
      finally
        Dispose(P);//如果换做GetMem和FreeMem的话,S所占的内存不会被释放。
      end
    end;
      

  4.   

    有点我没搞明白,为什么Delphi要用自己的内存管理机制,而不是用Windows的堆
    如果说这是为了跨操作系统开发那我信服,
    针对Windows的版本至少应该用Windows的堆吧,难道它觉得比Heapxxx效率高?
      

  5.   

    关于堆,我也有疑问。
    TList.Delete里调用了Move,而FList指向的不是不连续的内存吗,怎么可以还调Move?
      

  6.   

    看了一下delphi2007的getmem.inc,发现Delphi其实用的是虚拟内存操作函数VirtualAlloc等,而不是堆操作函数Heapxxx。《Windows核心编程》中指出:
    并且:
    可能虚拟内存操作比堆更灵活吧所以Delphi的堆只不过是操作虚拟内存罢了,地址是连续的——所以TList.Delete里调用了Move。
      

  7.   

    蒙了,跟是不是操作虚拟内存没关系,堆的内存地址对我们来说都是连续的,所以TList.Delete里调用了Move。
      

  8.   

    谁告诉你 TList 指向的内存不连续的?
    不用操作系统的内存管理器是效率问题,winapi 提供的只是“能用”的程度,离“效率高”差远了。
      

  9.   

    To s11ss:
    VirtualAlloc分配的不是虚拟内存,虚拟内存不被分配,而由操作系统管理,通过对物理分页内存(非分页内存不可交换)与虚拟内存之间的数据交换来增加运行时的可用内存空间。正如资料展示的那样VirtualAlloc对内存的管理是相当灵活的,通过各参数的配对使用除了可以完成常规的内存管理,还可以完成超大内存的管理,例如AWE(须AWE类API配合使用)。
      

  10.   


    抽空测了一下,娘的,真不是一个级别的,HeapAlloc的速度就是蜗牛,这有点搞不懂M$在干啥吃了。偏见偏见,3Q