我在同一个窗口中创建了两种指针,但是当窗口关闭时释放老是出错,请大家帮我想想怎么回事?
一种指针;
   New(PmyUserInfo);
          PmyUserInfo.UserID:=Fieldbyname('User_ID').AsString;
          PmyUserInfo.AreaID:=AreaID;
另一种指针:
   New(PmyArea);
          PmyArea.AreaID:=Fieldbyname('Area_ID').AsString;
          NewNode:=suiTreeV_OpLog.Items.AddChild(Node,Fieldbyname('Area_Name').Value);
关闭窗口时释放:
  suiTreeV_OpLog.Items.BeginUpdate;
  for i:=suiTreeV_OpLog.Items.Count-1 downto 0 do
  begin
    PmyUserInfo:=suiTreeV_OpLog.Items[i].Data;     
    dispose(PmyUserInfo);                           //释放
    suiTreeV_OpLog.Items[i].Delete;
  end;
 for i:=suiTreeV_OpLog.Items.Count-1 downto 0 do
  begin
     PmyArea:=suiTreeV_OpLog.Items[i].Data;     
    dispose( PmyArea);                           //释放
    suiTreeV_OpLog.Items[i].Delete;
  end;  suiTreeV_OpLog.Items.EndUpdate;

解决方案 »

  1.   

    窗口自己会自动释放指针,你可以看看把那两个dispose去掉,看看会不会出错
      

  2.   

    你的指针是不是一个,还是链表,如果是链表,你没有往下链
    在循环中多次DISPOSE同一个变量 了,肯定是出错的
      

  3.   

    另:
     自己NEW的指针,窗口是不会DISPOSE的,不释放只能造成MEM泄漏
      

  4.   

    严重同意楼上的
    for i:=suiTreeV_OpLog.Items.Count-1 downto 0 do
       dispose(PmyUserInfo);
    始终对同一个PmyUserInfo进行释放操作,,上面的可以这样写吗
    if PmyUserInfo not null then
       dispose(PmyUserInfo )记不太清了
      

  5.   

    呵呵,你是C的语法,这样if (PmyUserInfo <> NIL) then DisPose(PmyUserInfo);不过,你的指针只是一个变量,为什么要放在循环中释放呢,放外面就行了,
    不过在DISPOSE前先 判断一个指针是否为空是一个好习惯
      

  6.   

    这个指针的生成是在树创建的时候生成的,这棵树中有两种不同的指针,我用你们的写法写了,还是出了问题,结果是invalid pointer operation.
    我的写法如下:
    procedure TFrm_OperLog.FormClose(Sender: TObject;
      var Action: TCloseAction);
    begin
      if PmyUserInfo<>nil then
         dispose(PMyUserInfo);
      if PmyArea<>nil then
        dispose(PmyArea);
      Action:=caFree;
    end;
      

  7.   

    没必要循环:
    if Assigned(PmyUserInfo ) then
      dispose(PmyUserInfo );
      

  8.   

    Type
      PmyUserInfoData:PmyUserInfo;循环中改为:
        PmyUserInfoData:=PmyUserInfo(suiTreeV_OpLog.Items[i].Data);     
        dispose(PmyUserInfoData);  
    你报错原因是没确定类型
      

  9.   

    现在还是这个结果invalid pointer operation.
    我重新写了:
      if Assigned(PmyUserInfo) then
         dispose(PMyUserInfo);
      if Assigned(PmyArea) then
        dispose(PmyArea);
      

  10.   

    Type
     PmyUserInfoData:PmyUserInfo; 
     PmyAreaData:PmyArea;
              PmyUserInfoData:=New(PmyUserInfo);
              PmyUserInfoData.UserID:=Fieldbyname('User_ID').AsString;
              PmyUserInfoData.AreaID:=AreaID;
    另一种指针:
              PmyAreaData:=New(PmyArea);
              PmyAreaData.AreaID:=Fieldbyname('Area_ID').AsString;
              NewNode:=suiTreeV_OpLog.Items.AddChild(Node,Fieldbyname('Area_Name').Value);
    关闭窗口时释放:
      suiTreeV_OpLog.Items.BeginUpdate;
      for i:=suiTreeV_OpLog.Items.Count-1 downto 0 do
      begin
        PmyUserInfoData:=PmyUserInfo(suiTreeV_OpLog.Items[i].Data);     
        dispose(PmyUserInfoData);                           //释放
        suiTreeV_OpLog.Items[i].Delete;
      end;
     for i:=suiTreeV_OpLog.Items.Count-1 downto 0 do
      begin
         PmyAreaData:=PmyArea(suiTreeV_OpLog.Items[i].Data);     
        dispose( PmyAreaData);                           //释放
        suiTreeV_OpLog.Items[i].Delete;
      end;
      

  11.   

    执行到dispose( PmyAreaData); 就报错
      

  12.   

    你树里没有压入指针,就直接将树变量释放就可以了
    if Assigned(suiTreeV_OpLog) then
      FreeAndNil(suiTreeV_OpLog);
      

  13.   

    我建立树的时候怎么会没有压入指针嘛:
    我在同一个窗口中创建了两种指针,但是当窗口关闭时释放老是出错,请大家帮我想想怎么回事?
    一种指针;
       New(PmyUserInfo);
              PmyUserInfo.UserID:=Fieldbyname('User_ID').AsString;
              PmyUserInfo.AreaID:=AreaID;
    另一种指针:
       New(PmyArea);
              PmyArea.AreaID:=Fieldbyname('Area_ID').AsString;
              NewNode:=suiTreeV_OpLog.Items.AddChild(Node,Fieldbyname('Area_Name').Value);然后照你这样写了后还是出错:invalid pointer operation
      

  14.   

    ====执行到dispose( PmyAreaData); 就报错====
    suiTreeV_OpLog??? 请问你的TreeView是自行管理的还是设置了Owner的,如果是后者,确实会发现你说的情况。并且如果是后者,你后面不需要进行内存的释放了。