没辙了。。时不时跳出 invalid pointer operation 的错误。
软件代码太多了。。实在不知道该怎么帖。
是一个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 的错误,诚恳解决的方法。
[解决办法]
这里没有看出错误来。
贴文件试试我写的CSDNAtt,到这里下载: http://www.filelet.com
[解决办法]
看错了,不是这里的问题
[解决办法]
是不是Listview和Treeview在free的时候,会把data也释放掉了?