我想实现两个指针内容的复制。复制后显示目的指针显示内容正常。但如果我释放掉源指针,目的指针内容就为空。为什么??????????????。代码如下unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  //定义的结构
  Test = ^TTest;
  TTest = Record
    Text: String;
  end;  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    t: test;
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
  new(t);
  t.text := '111';
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Dispose(t);
end;procedure TForm1.Button1Click(Sender: TObject);
var tmp: test;
begin
  new(tmp);
  tmp.text := '222';
  CopyMemory(t, tmp, Sizeof(TTest));
  //这时t.text内容为‘222’
  Dispose(tmp);
end;procedure TForm1.Button2Click(Sender: TObject);
begin
  //释放tmp后,t.text内容为空。为什么????
  showmessage(t.text);
end;end.

解决方案 »

  1.   

    我没有用过copymemory,但我看一下源代码,这个只是复制了指针本身,不会复制出两套指针所指向的内容的,应该自己写一个方法进行cloneunit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      //定义的结构
      Test = ^TTest;
      TTest = Record
        Text: String;
      end;  TForm1 = class(TForm)
        btn1: TButton;
        btn2: TButton;
        //Button1: TButton;
        //Button2: TButton;
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        t: test;
        procedure Clone(src,target:Test);
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
      new(t);
      t.text := '111';
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Dispose(t);
    end;procedure TForm1.Button1Click(Sender: TObject);
    var tmp: test;
    begin
      new(tmp);
      tmp.text := '222';
      //CopyMemory(t, tmp, Sizeof(TTest));
      self.Clone(tmp,t);
      //这时t.text内容为‘222’
      Dispose(tmp);
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      //释放tmp后,t.text内容为空。为什么????
      showmessage(t.text);
    end;procedure TForm1.Clone(src, target: Test);
    begin
      target.Text:=src.Text;
    end;end.
      

  2.   

    你的结构定义中,text是string类型,是一个指针,在复制的时候,其实是指针的复制,拷贝后,t.text指向了temp.text,不是内容的复制。换成这样:
      CopyMemory(pChar(t.text), pChar(tmp.text), Sizeof(TTest));或者结构中不用string类型。
      TTest = Record
        Text: array[0..10] of char;
      end;  CopyMemory(t,tmp,sizeof(TTest));
      

  3.   

    procedure TForm1.Button1Click(Sender: TObject);
    var tmp: test;
    begin
      new(tmp);
      tmp.text := '222';
      CopyMemory(t, tmp, Sizeof(TTest));
      //这时t.text内容为‘222’
      Dispose(tmp);         这一句改为tmp := nil;试试
    end;
      

  4.   

    因为指针在复制的时候,其实是指针地址本身的复制,指向的都是同一内存,你只要释放一个指针中的内存,另一个指针指向的内存也就为空了,所以你只要清空指针的地址就好了tmp := nil