软件代码太多了。。实在不知道该怎么帖。是一个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 的错误,诚恳解决的方法。
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 的错误,诚恳解决的方法。
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
begin
ManagerFrom:= TDBControlFrom.Create(Self);
try
ManagerFrom.ShowModal;
finally
ManagerForm.Free;
end;
end;ManagerFrom的创建和释放从来不会有这个错误。我采用指针数组是因为我需要在许多listview和treeview等显示组件上显示数据,可以直接将指针赋给这些item.data,这样调用起来很方便。
是不是Listview和Treeview在free的时候,会把data也释放掉了?
没,没在释放item和node的时候写释放data的代码。