软件代码太多了。。实在不知道该怎么帖。是一个list类。一个指针列表。大致结构是这样的。
PItem = ^TItem;
TItem = record
  ID:Integer;
  Name: string;
  ...
  Icon:TIcon;
  G:TGraphic;
end;TItemList = class
private
  FList:TList;
public
  constructor create;
  destructor destroy; override;
  function Add:PItem;
  procedure Clear;
end;constructor TItemList.create;
begin
  FList:= TList.Create;
end;destructor TItemList.destroy; 
begin
  Clear;
  FList.Free;
  inherited;
end;
function TItemList.Add:PItem;
begin
  New(Result);
  FList.Add(Result);
end;procedure TItemList.Clear;
var 
  i: integer;
  p: PItem;
begin
  for i:= 0 to FList.Count - 1 do begin
    p:= PItem(FList.Items[i]);
    if Assigned(P^.Icon) then FreeAndNil(P^.Icon);
    if Assigned(P^.G) then FreeAndNil(P^.G);
    dispose(p);  // 在程序退出的时候,这个地方会出现 invalid pointer operation 的错误
  end;
  FList.Clear;
end;我是从一张数据表中读取数据到这个list中存储,程序运行过程中,反复Clear, Load, 重新加载这张列表到List中没出现过 invalid pointer operation 的错误。
但在程序退出时,时不时的在在dispose(P)处出现这个错误。实在是不知道怎么解决了,通过NEW申请的内存空间,得到的指针地址是不是永远不会变的? 有什么情况会改变这个指针呢,如果不会变那怎么会在dispose(P)的时候会出现错误的呢?因为表中的数据可能会有1000条左右吧。new的次数比较多,
以前采用数组指针的时候到没出现这样的错误过。
那个是
PItem_List = ^TItemList;
TItem_List = array[0..MaxInt div SizeOf(TItem)-1] of TItem;
然后
TItemList = class
  FList: PItem_List;
end;但这样在使用上会比较不方便,所以后来改成了指针数组,却时不时的会出现 invalid pointer operation 的错误,诚恳解决的方法。

解决方案 »

  1.   

    这里没有看出错误来。贴文件试试我写的CSDNAtt,到这里下载: http://www.filelet.com
      

  2.   

    procedure TItemList.Clear;
    var
    i: integer;
    p: PItem;
    begin
    for i:= 0 to FList.Count - 1 do begin
    p:= PItem(FList.Items[i]);
    if Assigned(P^.Icon) then FreeAndNil(P^.Icon);
    if Assigned(P^.G) then FreeAndNil(P^.G);
    dispose(p); // 在程序退出的时候,这个地方会出现 invalid pointer operation 的错误
    end;
    FList.Clear;
    end;
    这里写的有问题
    for i:= 0 to FList.Count - 1 do begin
    修改为
    for FList.Count - 1 downto 0 do begin
      

  3.   

    我现在实在弄不清楚到底是不是我的itemlist类出现问题,用到这个类有2个地方,一个客户端,一个后台。后台的管理工具是集成在客户端的procedure TClientForm.OpenManager(Sender:TObject);
    begin
      ManagerFrom:= TDBControlFrom.Create(Self);
      try
        ManagerFrom.ShowModal;
      finally
        ManagerForm.Free;
      end;
    end;ManagerFrom的创建和释放从来不会有这个错误。我采用指针数组是因为我需要在许多listview和treeview等显示组件上显示数据,可以直接将指针赋给这些item.data,这样调用起来很方便。
      

  4.   

    是不是Listview和Treeview在free的时候,会把data也释放掉了?
      

  5.   

    keyz(keyz) ( ) 信誉:104    Blog  2007-02-01 11:36:25  得分: 0  
       是不是Listview和Treeview在free的时候,会把data也释放掉了?
      
     
    没,没在释放item和node的时候写释放data的代码。