各位大虾,请教一个关于记录指针内存释放问题。虽然看到了不少关于次问题的帖子,但是没看明白。我在使用TTreeView的时候,定义了一个记录指针,以对应TTreeNode的Data属性。
在使用的时候我是用New()申请的内存。在我使用结束,也可以说是在窗口(不是主窗体)关闭的时候,我该怎么把这些申请的内存释放掉呢?我试过在FormClose事件中用写如下代码,可是不管用。
for i := 0 to tvwPoint.Items.Count - 1 do
dispose(tvwPoint.Items[i].Data)我的这个树比较大,所以申请的该记录的指针也比较多。
请教,谢谢!
在使用的时候我是用New()申请的内存。在我使用结束,也可以说是在窗口(不是主窗体)关闭的时候,我该怎么把这些申请的内存释放掉呢?我试过在FormClose事件中用写如下代码,可是不管用。
for i := 0 to tvwPoint.Items.Count - 1 do
dispose(tvwPoint.Items[i].Data)我的这个树比较大,所以申请的该记录的指针也比较多。
请教,谢谢!
Note: If compiling with {$I+}, use exceptions to handle this error. When an invalid pointer is passed to Dispose it raises an EInvalidPointer exception.
正常情况我是在窗口关闭的时候释放,因为相应的指针我要使用。
那我在窗口关闭的时候该怎么写呢?真的象wdsimon()说的不用我释放吗?
你只需要树的根结点就行。
问题是我每次创建的指针的名字都是相同的。
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被释放时,系统会自动释放它。
P.属性 := 值,TreeView1.Items.AddChildObject(TreeView1.Selected,'1111',p)就把刚增加的节点的指针指向了P,也就是说这个节点的data属性指向了刚申请的内存。那么我Dispose(TreeView1.Items[i].data)也就相当于释放了刚申请的内存。
(假设刚才增加的节点的绝对索引值是i)我这么理解对吗?
如果对,那么我写的循环释放内存的代码就没问题,可是为什么我用资源管理器查看,内存并没有减少呢?
困惑中……