用New()函数能为一个指针分配指定长度的内存空间。
在为某个结构分配内存时,因为编译器知道要分配的内存的大小,所以调用
New()就能分配到所需的字节。
用Dispose()来释放用New()分配的内存。
当编译器不知道要分配多少内存时,就要用到GetMem()和AllocMem().
另,AllocMem()要比GetMem()安全,因为AllocMem()总是把分配个它的内存初始化为零。

解决方案 »

  1.   

    FreeMem(P) //出现异常(Invalid pointer operation)
    可能是你在对P进行非法操作而引起的sizeof(p^)=1而不是我期望的MAX_PATH(260)
    =1是正确的,因为p^是p指针指向的第一个字符所以长度为1
      

  2.   

    GetMem(P,MAX_PATH);
      FreeMem(P);
     这样就不会出错,因为你创建了然后释放,这是对的。
      如果中间用了GetWindowsdirectory(P,MAX_PATH);在释放,就会出错,
    原因是 ,因为pchar在用时系统会分配一块内存给它,这样,P不在是你分的那块内存,也许是系统使用的一部分,这样调用freemem就会出错。
      

  3.   

    解决方法,不要用getmem,pchar就可以直接用。
      

  4.   

    var
      s:string;
    begin
      setlength(s,MAX_PATH);
      getwindowdirectory(pchar(s),MAX_PATH);
      setlength(s,strlen(pchar(s));
    end;
    D5开发人员指南28页
      

  5.   

    不需要FREE,因为STRING类型,内存自管理
      

  6.   

    var
    P:PChar;
    begin
      P := PChar(AllocMem(MAX_PATH)); <-- 
      try 
        GetWindowsdirectory(P,MAX_PATH);
        ...
        ...
      finally
        FreeMem(P); //出现异常(Invalid pointer operation)
        //P:=nil
      end;
    end;