type
  PPersonData = ^TPersonData;
  TPersonData = record
    PersonName: string;
    PersonID: string;
  end;procedure TForm1.FormCreate(Sender: TObject);
var
  PersonData1: PPersonData;
  PersonNode: TTreeNode;
begin
  Query1.First;
  while not Query1.Eof do
  begin
    New(PersonData1);
    PersonData1^.PersonName := Query1.fieldbyName('PersonName').AsString;
    PersonData1^.PersonID    := Query1.fieldByName('PersonID').AsString;    PersonNode := TreeView1.Items.Add(nil, PersonData1^.PersonName);
    PersonNode.Data := pointer(PersonData1);
    Query1.Next;
  end;
end;请问以上程序中PersonNode.Data和PersonData1的内容在程序结束时是否需要释放,
如果要,应在哪里释放?怎么释放?

解决方案 »

  1.   

    FormDestory 中释放。释放整个链表,需要遍历列表。
    Dispose()
      

  2.   

    同意楼上,一般情况下对于你new出来的东西都要在结束的时候释放掉
      

  3.   

    to:  CloneCenter(复制中心)
    能说得详细一点吗?
    或给一些代码.
    谢谢!!!!!!!!!!1
      

  4.   

    应该在Treeview的OnDeletion中释放,不过,你在form的OnClose或者析构函数中应该删除TreeView的所有节点,如下:procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
    var
      pd: PPersonData;
    begin
      if node=nil then exit;
      pd:=node.data;
      if pd=nil then exit;
      pd.free;
      showmessage(Node.Text+' deleted');
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      treeview1.items.clear;
    end;
      

  5.   

    我认为你的程序需要修改一下procedure TForm1.FormCreate(Sender: TObject);
    var
      PersonData1: PPersonData;
      PersonNode: TTreeNode;
    begin
      New(PersonData1);  //放在这里,直接用一个指针就可以,为什么每次循环用一个呢?
      Query1.First;
      while not Query1.Eof do
      begin
        //下面这两句中的FieldByName最好换成FieldValues,效率会高一些
        //从D5开始就已经不提倡使用FieldByName了
        PersonData1^.PersonName := Query1.fieldbyName('PersonName').AsString;
        PersonData1^.PersonID    := Query1.fieldByName('PersonID').AsString;
        //你的PersonNode在使用前不需要构造吗?构造的时候指定Owner不就不用自己释放了吗?
        PersonNode := TreeView1.Items.Add(nil, PersonData1^.PersonName);
        PersonNode.Data := pointer(PersonData1);
        Query1.Next;
      end;
    end;一家之言,仅供参考!
      

  6.   

    另外,你使用New方法建立的指针是局部变量,是存放在栈中的,在超出作用域后会自动释放还有必要在自己释放?