请帮我看看这段代码吧,出错呀,AllocMem分的内存会和string管理的内存冲突,怎么办
procedure TForm1.Button1Click(Sender: TObject);
var
  str:string;
  b:PChar;
begin
  str:='sdfasdf';
  b:=PChar(AllocMem(1024));
  FillChar(b,1024,0);//---------->把这段空间都用掉
  ShowMessage(str);//------->这里的str的值已不存在了
  FreeMem(b);
end;
同样的,SetLength也有同样的问题,不知这是不是delphi5的BUG

解决方案 »

  1.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      str:string;
      b:PChar;
    begin
      str:='sdfasdf';
      b:=PChar(AllocMem(1024));
      FillChar(b,sizeof(b),0);
      ShowMessage(str);
      dispose(b);
    end;
      

  2.   

    动不动就说BUG,请首先找找自己的原因
      

  3.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      str:string;
      b:PChar;
    begin
      str:='sdfasdf';
      b:=pchar(AllocMem(1024));
      //strcopy(b,pchar('aa'));
      fillchar(b^,1024,0);
      //FillChar(b,1024,0);//---------->把这段空间都用掉
      ShowMessage(str);//------->这里的str的值已不存在了
      FreeMem(b);
    end;
      

  4.   

    谢谢,fillchar的第一个参数是个引用值,不是指针,果然这样改了就好了
    不过错误的要源是因为delphi帮助里的这段代码,它骗了我
    procedure TForm1.Button1Click(Sender: TObject);var
      iFileHandle: Integer;
      iFileLength: Integer;
      iBytesRead: Integer;
      Buffer: PChar;
      i: Integer
    begin
      if OpenDialog1.Execute then
      begin
        try
          iFileHandle := FileOpen(OpenDialog1.FileName, fmOpenRead);
          iFileLength := FileSeek(iFileHandle,0,2);
          FileSeek(iFileHandle,0,0);
          Buffer := PChar(AllocMem(iFileLength + 1));
          //======================================================= 
          iBytesRead = FileRead(iFileHandle, Buffer, iFileLength);  
          //这句中的Buffer也是个引用值,可它一样传了个指针过来
          //=======================================================
          FileClose(iFileHandle);      for i := 0 to iBytesRead-1 do
          begin
            StringGrid1.RowCount := StringGrid1.RowCount + 1;
            StringGrid1.Cells[1,i+1] := Buffer[i];
            StringGrid1.Cells[2,i+1] := IntToStr(Integer(Buffer[i]));
          end;
        finally
          FreeMem(Buffer);
        end;
      end;
    end;