关于释放指针的问题,有点怪,

肥仔胧 2007-11-05 09:12:29
PFuncInfo=^TFuncInfo
TFuncInfo=record
DispName: string;
Level: Integer;
end;


var
mFuncList: TStringList;//全局变量

代码大概如下:
procedure Init;
var
FuncInfo: PFuncInfo;
i: Integer;
begin
for i := 0 to sTempList.Count - 1 do
begin
New(FuncInfo);
with FuncInfo^ do
begin
DispName := sTempList.Strings[i];
Level := i;
mFuncList.AddObject(DispName, TObject(@FuncInfo));
end;
end;
end;


然后我在释放的时候如下:
procedure FreeFuncInfo;
var
i: Integer;
FuncInfo: PFuncInfo;
begin
if mFuncList <> nil then
begin
for i := 0 to mFuncList.Count - 1 do
begin
FuncInfo := PFuncInfo(mFuncList.Objects[i]);
if FuncInfo <> nil then
Dispose(FuncInfo);//此行出错,请教原因
end;
end;
end;

以上到底是怎么错了呢?谢谢!
...全文
100 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
禹爸爸 2007-11-06
  • 打赏
  • 举报
回复
你定义的FuncInfo本身就已经是个指针了,再用取地址符号进行运算,你添加到mFuncList中的就是指针的指针了。
肥仔胧 2007-11-05
  • 打赏
  • 举报
回复
问题解决了:
直接用:
mFuncList.AddObject(DispName, TObject(FuncInfo));
释放的时候:
FuncInfo := PFuncInfo(mFuncList.Objects[i]);
if FuncInfo <> nil then
begin
Dispose(FuncInfo);
end;

但是用
mFuncList.AddObject(DispName, TObject(@FuncInfo));
释放的时候用
FuncInfo := PFuncInfo(Pointer(mFuncList.Objects[i])^);
Dispose(FuncInfo);
还是会报错啊,请教ysai或者其他朋友这是怎么解释呢?谢谢!
肥仔胧 2007-11-05
  • 打赏
  • 举报
回复
mark,等会试试
ysai 2007-11-05
  • 打赏
  • 举报
回复
mFuncList.AddObject(DispName, TObject(@FuncInfo));
>>
mFuncList.AddObject(DispName, TObject(FuncInfo));
已经是指针了,不要再取地址


mFuncList.AddObject(DispName, TObject(@FuncInfo));
增加的是一个指向指针的指针,对应的释放方法是
PFuncInfo(Pointer(mFuncList.Objects[i])^);
starluck 2007-11-05
  • 打赏
  • 举报
回复
不好意思,贴错了。

没问题。你照JWPL190的方法将TSTRINGLIST CLEAR一下看一下。
肥仔胧 2007-11-05
  • 打赏
  • 举报
回复
//此处不解;
mFuncList.AddObject(DispName, TObject(@FuncInfo));

仅仅是为了存放一个记录类型的指针
方便以后调用

这样写有问题吗?
starluck 2007-11-05
  • 打赏
  • 举报
回复
//此处不解;
mFuncList.AddObject(DispName, TObject(@FuncInfo));

procedure FreeFuncInfo;
var
i: Integer;
FuncInfo: PFuncInfo;
begin
if mFuncList <> nil then
begin
for i := 0 to mFuncList.count-1 do
begin
if Assigned(PFuncInfo(mFuncList.Objects[i]) then begin
Dispose(PFuncInfo(mFuncList.Objects[i]);
end;
end;
end;
jwpl190 2007-11-05
  • 打赏
  • 举报
回复
在我机器上执行没有问题,可能是你的mFuncList是用来Add,方法,建议在使用之前清空
mFuncList.Clear
肥仔胧 2007-11-05
  • 打赏
  • 举报
回复
我只是释放mFuncLIst里面Object的指针,并没有删除mFuncList的某个项,需要倒着删吗?
dulei115 2007-11-05
  • 打赏
  • 举报
回复
释放的时候倒着删
for i := mFuncList.Count - 1 downto 0 do

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧