(1)
GetMem(P, 512)  GetMem(P, 1024)  <---- 是释放先前的P后再重新分配1024吗?FreeMem(P)
(2)
GetMem(P, 512)  GetMem(P, 256)  <---- 是释放先前的P后再重新分配256吗?FreeMem(P)

解决方案 »

  1.   

    //不要说应该怎样,用例子证明一下
    procedure TForm1.Button1Click(Sender: TObject);
    var
    p:pchar;
    begin
       getmem(p,10);
       p:='aaaaaaaaa';
        showmessage(p);
       getmem(p,15);
       showmessage(p); //因为没有赋值,所以随机,多点几次就可以看出来
    end;
      

  2.   

    这样也不能看出来啊procedure TForm1.Button1Click(Sender: TObject);
    var
      p: pchar;
      p2: pchar;
    begin
       GetMem(p, 10);
       p := 'aaaaaaaaa';
       p2 := p; //先把p2 保存这个p 的地址
       GetMem(p,100);
       p := 'asdfasdfasdfasdfdsfasdfasdfasdfasdfasdfasdf';//改变它
       ShowMessage(p2); //看p2,就是原地址,多试几次
    end;
      

  3.   

    var
      F: file;
      Size: Integer;
      Buffer: PChar;
    begin
      AssignFile(F, 'c:\test.txt');
      Reset(F, 1);
      try
        Size := FileSize(F);
        GetMem(Buffer, Size);
        try
          BlockRead(F, Buffer^, Size);
          Memo1.Lines.Text:=Buffer;
    //      ProcessFile(Buffer, Size);
          GetMem(Buffer,Size);
          Memo2.Lines.Text:=Buffer;
        finally
          FreeMem(Buffer);
        end;
      finally
        CloseFile(F);
      end;
    end;
    原来的内容已经不在了,说明已经重新分配了地址。
      

  4.   

    var
      F: file;
      Size: Integer;
      Buffer: PChar;
      Buffer2:Pchar;
    begin
      AssignFile(F, 'c:\test.txt');
      Reset(F, 1);
      try
        Size := FileSize(F);
        GetMem(Buffer, Size);
        Buffer2:=Buffer;
        try
          BlockRead(F, Buffer^, Size);
          Memo1.Lines.Text:=Buffer;
    //      ProcessFile(Buffer, Size);
          GetMem(Buffer,Size);
        finally
          FreeMem(Buffer);
        end;
        Memo2.Lines.Text:=Buffer2;
      finally
        CloseFile(F);
      end;
    end;
    虽然重新分配了新的地址,通过Buffer2可以看出旧地址的内容还在,还没有释放。
      

  5.   

    var
      F: file;
      Size: Integer;
      Buffer: PChar;
      Buffer2:Pchar;
      Buffer3:PChar;
    begin
      AssignFile(F, 'c:\test.txt');
      Reset(F, 1);
      try
        Size := FileSize(F);
        GetMem(Buffer, Size);  //第一次申请
        Buffer2:=Buffer;       //将Buffer2指向和Buffer同样的地址空间
        try
          BlockRead(F, Buffer^, Size);
          Memo1.Lines.Text:=Buffer;
    //      ProcessFile(Buffer, Size);
          GetMem(Buffer,Size);  //重新分配了新的地址,新的空间
        finally
          FreeMem(Buffer);  //这个时候释放的是后来分配的空间
        end;
        Memo2.Lines.Text:=Buffer2;  //从这里可以看出原来分配的空间并未释放
        Buffer3:=Buffer2;
        FreeMem(Buffer3);  //这个时候才释放了原来分配的空间=FreeMem(Buffer2);
        Memo3.lines.text:=Buffer2;  //已经找不到原来的内容了
      finally
        CloseFile(F);
      end;
    end;