我在同一个窗口中创建了两种指针,但是当窗口关闭时释放老是出错,请大家帮我想想怎么回事?
一种指针;
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;
一种指针;
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;
在循环中多次DISPOSE同一个变量 了,肯定是出错的
自己NEW的指针,窗口是不会DISPOSE的,不释放只能造成MEM泄漏
for i:=suiTreeV_OpLog.Items.Count-1 downto 0 do
dispose(PmyUserInfo);
始终对同一个PmyUserInfo进行释放操作,,上面的可以这样写吗
if PmyUserInfo not null then
dispose(PmyUserInfo )记不太清了
不过在DISPOSE前先 判断一个指针是否为空是一个好习惯
我的写法如下:
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;
if Assigned(PmyUserInfo ) then
dispose(PmyUserInfo );
PmyUserInfoData:PmyUserInfo;循环中改为:
PmyUserInfoData:=PmyUserInfo(suiTreeV_OpLog.Items[i].Data);
dispose(PmyUserInfoData);
你报错原因是没确定类型
我重新写了:
if Assigned(PmyUserInfo) then
dispose(PMyUserInfo);
if Assigned(PmyArea) then
dispose(PmyArea);
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;
if Assigned(suiTreeV_OpLog) then
FreeAndNil(suiTreeV_OpLog);
我在同一个窗口中创建了两种指针,但是当窗口关闭时释放老是出错,请大家帮我想想怎么回事?
一种指针;
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
suiTreeV_OpLog??? 请问你的TreeView是自行管理的还是设置了Owner的,如果是后者,确实会发现你说的情况。并且如果是后者,你后面不需要进行内存的释放了。