各位大虾,请教一个关于记录指针内存释放问题。虽然看到了不少关于次问题的帖子,但是没看明白。我在使用TTreeView的时候,定义了一个记录指针,以对应TTreeNode的Data属性。
在使用的时候我是用New()申请的内存。在我使用结束,也可以说是在窗口(不是主窗体)关闭的时候,我该怎么把这些申请的内存释放掉呢?我试过在FormClose事件中用写如下代码,可是不管用。
for i := 0 to tvwPoint.Items.Count - 1 do 
   dispose(tvwPoint.Items[i].Data)我的这个树比较大,所以申请的该记录的指针也比较多。
请教,谢谢!

解决方案 »

  1.   

    用New()申请应该用Free()释放啊!
      

  2.   

    数的Data里面的东西不需要你释放,树销毁的时候会自动释放
      

  3.   

    Sorry,我错了,不过
    Note: If compiling with {$I+}, use exceptions to handle this error. When an invalid pointer is passed to Dispose it raises an EInvalidPointer exception.
      

  4.   

    我想说的是我释放的时候该怎么写。
    正常情况我是在窗口关闭的时候释放,因为相应的指针我要使用。
    那我在窗口关闭的时候该怎么写呢?真的象wdsimon()说的不用我释放吗?
      

  5.   

    用 NEW 申请的,要用 DISPOSE 来释放。
    你只需要树的根结点就行。
      

  6.   

    释放的对像应该是你new 的对像,
      

  7.   

    to CSharpSky:我知道释放的应该是我创建的对象。
    问题是我每次创建的指针的名字都是相同的。
      

  8.   

    应该在自己创建节点完成后释放,比如:
    type
      PInt=^integer;
    procedure AddNewNode;
    var
      NewNode: TTreeNode;
      p:PInt;
      RecNo: integer;
    begin
      new(p);
      //这里需要指定一个父结点,如果是创建第一层结点,那么父结点应该用nil。
      //这里假设父结点为ParentNode;
      //将p^赋值,必须为一整数。我一般是数据库程序中用表记录的ID号。
      p^:=RecNo;
      NewNode:=TreeView1.Items.AddChildObject(TreeView1.Selected,'1111',p);
      dispose(p);
    end;你只需要释放用new函数创建的指针就可以了,NewNode对象在TreeView1被释放时,系统会自动释放它。
      

  9.   

    sorry!上面中的TreeView1.Selected应该改为ParentNode.不好意思。写习惯了。
      

  10.   

    如果P是一个记录指针,那么New(P)就申请了一快内存,
    P.属性 := 值,TreeView1.Items.AddChildObject(TreeView1.Selected,'1111',p)就把刚增加的节点的指针指向了P,也就是说这个节点的data属性指向了刚申请的内存。那么我Dispose(TreeView1.Items[i].data)也就相当于释放了刚申请的内存。
    (假设刚才增加的节点的绝对索引值是i)我这么理解对吗?
    如果对,那么我写的循环释放内存的代码就没问题,可是为什么我用资源管理器查看,内存并没有减少呢?
    困惑中……