这样做会发生内存漏失吗?  TTest = record
    a : string;
  end;
  PTest = ^TTest;
var
  P : PTest;
  P2 : pointer;
begin
  P := new(PTest);
  p.a := 'abc';
  p.a := p.a + '333';
  P2 := p;
  Dispose(P2);

解决方案 »

  1.   

    不会
    P := new(PTest);
    Dispose(P2);
    都释放掉了
    p.a 因为创建在栈里 引用记数为0 也会释放的
      

  2.   

    你的代码有错误。
    P := new(PTest);//?应改为new(p);
    在delphi中,New是这样申明的procedure New(var P: Pointer);
    p2,p都指向了new(p)分配的内存区域,Dispose(p2)释放p2指向的内存区域。
    因此不会产生内存泄漏。
      

  3.   

    好象會產生洩漏我是這樣測試的:
    按樓主的代碼,我寫在一個Button的雙擊事件中,編譯成EXE文件後,
    再執行,一直點擊那個Button,然後我打開《工作管理員》發現:程序占用的內存一直在上升所以我判斷出,不能釋放
    我估計是string類型出的問題
      

  4.   

    P := new(PTest);  ---> New(P)
      p.a := 'abc';
      p.a := p.a + '333';
      P2 := p;
      Dispose(P2);       ---->释放
      

  5.   

    其实想确定是否释放,你只要在Dispose(P2);  后再加个Dispose(p);  就可以了,试试看,应该会报错吧!
      

  6.   

    应用程序的内存区可以分为三类:全局变量区、栈、堆。应用程序开始运行时,所有全局变量的内存都被分配到全局变量区,应用程序结束时被释放,被分配到栈上的变量内存可被占管理器自动释放,堆上的变量内存必须人工释放;
    指针就是堆上的内存,所以要手动释放,在dispose之后,所有与那个内存地址相关的联系都被切断,所以不会产生内存泄露...
      

  7.   

    看书上对于dispose是这么解释的
    他和freemem功能相似,不过他会首先将long strings、variants、dynamic arrays置为空、interfaces为Unassigned;
    执行了下面的代码,会发现很多有趣的事情,//后面的是我的执行结果,不同机器结果应该不同的...
    procedure TForm1.Button1Click(Sender: TObject);
    var
      P : PTest;
      P2 : pointer;
    begin
      P := new(PTest);
      p.a := 'abc';
      p.a := p.a + '333';
      P2 := p;
      showmessage(IntToStr(Integer(P2^))); //13450604
      showmessage(IntToStr(Integer(P2)));  //13450584
      showmessage(IntToStr(Integer(P^)));  //13450604
      showmessage(IntToStr(Integer(P)));   //13450584
      showmessage(IntToStr(Integer(@P)));  //1242440
      showmessage(IntToStr(Integer(@P2))); //1242436
      Dispose(P2);
      P.a:='新的内容';
      showmessage(p.a);
      showmessage(PTest(P2).a);
      showmessage(IntToStr(Integer(P2^))); //13450580
      showmessage(IntToStr(Integer(P2)));  //13450584
      showmessage(IntToStr(Integer(P^)));  //13450580
      showmessage(IntToStr(Integer(P)));   //13450584
      showmessage(IntToStr(Integer(@P)));  //1242440
      showmessage(IntToStr(Integer(@P2))); //1242436end;
      

  8.   

    showmessage(p.a);
    showmessage(PTest(P2).a);
    不同啊,不同,谁能解释一下这个现象...
    想要把这个问题搞明白,不然今天就不吃饭了
      

  9.   

    CSDN上的人原来都这么残忍,看来你们真的是不想让我吃饭了...
      

  10.   

    P2 := p;
    ...
    Dispose(P2);p会被释放
      

  11.   

    I Know it but , how and why?
      

  12.   

    这样做会发生内存漏失吗?  TTest = record
        a : string;
      end;
      PTest = ^TTest;
    var
      P : PTest;
      P2 : pointer;
    begin
      P := new(P);  // 这里错误,改正一下, 谢谢 sxqwhxq(步青云)
      p.a := 'abc';
      p.a := p.a + '333';
      P2 := p;
      Dispose(P2);
    最后根据汇编代码分析,这样做会发生内存漏失,谢谢各位的回答
                               ==理由是:
      Dispose(P2); // 只能释放 TTest 这个 Record的内存,而不能释放 a 这个字符串所申请的内存因为 Dispose(P2) 只会调用 FreeMem
    而   Dispose(P)  会在 FreeMem 前,调用释放 Record内字段的一段程序
      

  13.   

    Dispose(P2)  = FreeMem(P2)Dispose(P)  =
      Finalize(P); // 在这里释放 a 这个字符串的内存
      FreeMem(P);
      

  14.   

    回复人: heluqing(鉴之小河〖挣大钱娶美女〗) ( ) 信誉:100  2005-05-23 17:16:00  得分: 0  showmessage(p.a);
    showmessage(PTest(P2).a);
    不同啊,不同,谁能解释一下这个现象...
    想要把这个问题搞明白,不然今天就不吃饭了
    ======================================================
    有不同吗?