解决方案 »

  1.   


    var
      TempP, OutP, tempp1, outp1: PChar;
      TempS, Outstr: string;
      I: Integer;
    begin
      TempP := StrAlloc(1024);  //申请1KB内存,并将TempP指向这块内存
      ShowMessage(Format('TempP的地址为:%p',[Pointer(TempP)]));
      TempS := TempS + '12344545454'; //为TempS赋新值,导致一次CopyOnWrite
      ShowMessage(Format('TempS的地址为:%p',[Pointer(TempS)]));
      TempP := PChar(TempS);  //将TempP指向TempS的地址(TempP指向的原1KB内存无法释放了,因为没有指针可以指向它了)
      ShowMessage(Format('TempS的地址为:%p%sTempP新地址为:%P',[Pointer(TempS),#13#10,Pointer(TempP)]));
      Outstr := StrPas(TempP);
      StrDispose(TempP); //TempP指向的地址根本不是你手动申请的,它是CopyOnWrite后的string,无法用StrDispose释放
      Edit1.Text := Outstr;
    end;
      

  2.   


    var
      TempP, OutP: PChar;
      TempS, Outstr: string;
    begin
      TempP := StrAlloc(1024); // 申请1KB内存,并将TempP指向这块内存
      OutP := TempP; // 虽然下面的代码将TempP指向新地址(导致内存泄露),好在这里用OutP指向了这1KB内存,后面还是可以释放这块内存的
      ShowMessage(Format('TempP保存的地址为:%p', [Pointer(TempP)]));
      TempS := TempS + '12344545454'; // 为TempS赋新值,导致一次CopyOnWrite
      ShowMessage(Format('TempS保存的地址为:%p', [Pointer(TempS)]));
      TempP := PChar(TempS); // 将TempP指向TempS的地址
      ShowMessage(Format('TempS保存的地址为:%p%sTempP保存的新地址为:%P', [Pointer(TempS), #13#10,Pointer(TempP)]));
      Outstr := StrPas(TempP);
      StrDispose(OutP); //幸好之前用OutP指向了这块内存,不然这1KB内存就泄露了
      Edit1.Text := Outstr;
    end;
      

  3.   

    procedure TForm1.Button2Click(Sender: TObject);
    var
      TempP,OutP,tempp1,outp1:PChar;
      TempS,Outstr:string;
      I:Integer;
    begin
      TempP:=StrAlloc(1024);
      TempS:=TempS+'12344545454';
      StrPCopy(TempP, TempS);
      Outstr:=StrPas(TempP);
      StrDispose(TempP);
      Edit1.Text:=Outstr;
    end;
    这样修改,就可以了。