送分了,怎么知道一个对象实体被FREE掉了

seewell 2001-06-28 12:06:56
如果不把对象实体:=nil,怎么能判断出一个对象被FREE了?
当然可以TRY 访问一下这个对象,若出错那么就是被FREE了
但是有没有更好一点的方法?
...全文
659 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuting 2001-07-02
  • 打赏
  • 举报
回复
  但是这几个既然是Windows API,我想大概只有对用Windows Memory API进行分配的指针
结果才准确吧。如果VCL有自己更高层的内存管理机制,那么只能看它有没有提供类似的函数了。
  另外,前面BlueTrees说“即使Delphi释放了,操作系统也不一定真正的回收了,因为。。。”,我想可能是因为运行库的原因,如果不是直接调用Windows API,那么内存的分配
和释放都是通过运行库进行的,它的内部为了效率也可能实现自己的管理机制。
xuting 2001-07-02
  • 打赏
  • 举报
回复
有几个Windows API: IsBadXXXPtr(),可以检查指针地址的读写权限,大家可以试一下。
xiaodaoren 2001-07-01
  • 打赏
  • 举报
回复
你是不是说指针为nil值和对象实例被释放时指针的值的不同
xiaodaoren 2001-07-01
  • 打赏
  • 举报
回复
我决的不应在其中出显对象实例是否存在的判段,你在做什麽?
actor 2001-07-01
  • 打赏
  • 举报
回复

同意slx_7(稻草人),其实很简单的问题,用一把异常了就不存在了,最直接
光明山人 2001-06-30
  • 打赏
  • 举报
回复
我觉得没有办法,否则Delphi应该会给一个函数,或者Free方法会判断。
但是也还是有解决办法的。

第一:如果是FORM的话,你可以从Screen中找看有没有它(Screen.Forms);如果是TControl或TComponent的派生类,应该也可以从Application和Screen.Forms顺滕摸瓜找到;
第二:非常不确切,我似乎从哪本书上看到Delphi有对象管理机制,可能能从这方面入手进行全能的控制;
第三:如果你非要管理,你可以进行自己一套管理机制,如在Form中增加一个List,其中每一项是变量的地址或你的glList,在赋值时往List中加这些东东,然后在FormDestroy中按照List去掉每一个。如:
for i:=List.Count-1 downto 0 do
begin
if IsVarPtr(List[i]) then
PTForm(List[i])^ := nil
else
TList(List[i]).Remove(Self);
end;
甚至还可以这样:
每个List中的项都存的是事件处理器:
for i:=List.Count-1 downto 0 do
TNotifyEvent(List[i])(Self);


seewell 2001-06-30
  • 打赏
  • 举报
回复
我试试
就给分
seewell 2001-06-30
  • 打赏
  • 举报
回复
多谢各位!
slx_7 2001-06-30
  • 打赏
  • 举报
回复
首先,应该避免你所描述情况的发生才是上策,在写程序时,若这个指针所指向的对象已经释放掉了,同时应该将该指针置空。
若已经发生了,是不是可以
function IsValid(APointer :Pointer): Boolean;
begin
Result := True;
try
引用一下
except
Result := False;
end;
end;

此外,若想知道指向的对象实体是否已经被释放了,需要找些关于Delphi编译的书读,以前听过别人的课,描述了Delphi的内存分配,但现在记不清楚了。大概是一个栈?有时间打开Delphi的system等单元看看(若能看明白)。
tianjin 2001-06-29
  • 打赏
  • 举报
回复
这样可以吗?
if form.findcomponent('Edit1') is TEDIT then ...
if form.findcomponent('Memo1') is TMemo then ...

........
BlueTrees 2001-06-29
  • 打赏
  • 举报
回复
同意楼上的,如果你自己不把它赋值为nil根本没有办法确定他有没有被释放掉,因为使用Delphi的内存管理器,他会有自己的内存使用策略,不一定会释放,还给操作系统,即使Delphi释放了,操作系统也不一定真正的回收了,因为Windows(其实所有的都差不多)操作系统是基于页面分配地址的,小块的释放,不一定会被回收,有时(很多时候,你可以试着释放一个动态数据试试,不大的情况下,都不会报告错误)还是可以继续使用的!,当然这变得不可预知了!
weenyboy 2001-06-29
  • 打赏
  • 举报
回复
truezerg(赵明宇) 说的不错,但那不是 bugs,是delphi保证效率的方法之一,该内存能够被delphi 再分配,但并没有将它返回给操作系统
武稀松 2001-06-29
  • 打赏
  • 举报
回复
看看他的举兵是否为0
truezerg 2001-06-29
  • 打赏
  • 举报
回复
告诉大家Delphi的一个BUG,在Delphi中,用FREE地方法放掉一块内存,其实DELPHI地并没有放掉大家不信可以用你们所知道的任何方法试
kuangning 2001-06-29
  • 打赏
  • 举报
回复
FORM1.RELEASE ;
FORM1:=NIL ;
石榴刺猬 2001-06-29
  • 打赏
  • 举报
回复
其实Assigned这个函数也只是判断指针是否是nil,
最好的方法就是每次释放完了以后将它赋值为nil。
然后以后用Assigned判断。

这是一个编程习惯的问题,要养成一个好的编程习惯可以减掉不少麻烦那。
myxfang 2001-06-29
  • 打赏
  • 举报
回复
所以你要加:(Assigned(MyFormInstance)=false)
seewell 2001-06-29
  • 打赏
  • 举报
回复
myxfang(小方),我说的不是这个意思.
比如
glList: TList;
glform: Tform;
procedure ss;
begin
glList.Add(glform);
......
glForm.Free;
glForm := nil;
//此时的glList[0]不是nil
//但是访问这个指针所指的form却会出错
end;
帮忙再看看
myxfang 2001-06-29
  • 打赏
  • 举报
回复
不用再提前
我是这样做的:
if (Assigned(MyFormInstance)=false) or (MyFormInstance.ComponentCount=0) then
MyFormInstance:=TMyFormInstance.create(application);
MyFormInstance.show;

seewell 2001-06-29
  • 打赏
  • 举报
回复
提前
加载更多回复(20)

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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