怎样判断一个对象变量是否已被释放?(100分)

  • 主题发起人 主题发起人 hophy
  • 开始时间 开始时间
H

hophy

Unregistered / Unconfirmed
GUEST, unregistred user!
请看下面的程序,如何才能避免出现内存错?
obj1, obj2: TObject;
.....
obj1:=TObject.Create;
obj2:=Obj1;
.........
FreeAndNil(obj1);
.........
if Assigned(Obj2) then
ShowMess(Obj2.ClassName)
//这里出错了
因为Obj1与Obj2都指向同一个对象,Obj1释放了,但Obj2仍指向原来的低值。

现问题是“if Assigned(Obj2) then”应改成什么才能不会调用“ShowMess(Obj2.ClassName)
//这里出错了”
 
if Obj2 = nil then
 
obj2
obj1
是指针

obj2:=Obj1;
的时候只是把一个地址附给了obj2
当FreeAndNil(Obj1)的时候
Obj1为nil
但此时的Obj2仍指向原来的地址
但是那块内存已经在
FreeAndNil()的时候释放掉了
所以会报非法地址访问的错误
 
不行的,obj2只是一个指针,虽然指针指向的内存已经被释放,但指针本身还是存在的,前几天好像也有人提了这个问题,没有什么解决办法,顶多使用异常来判断指针内容是否还存在。作为一个优秀的编程者必须能够控制指针的生命周期,不能随便用的。
 
楼上的应该对的。
Assigned判断的是有没有被赋过值(即通常是判断当前变量有没有指定某个内存地址),而不是判断内存中保存的内容是不是nil, nil与未赋值是不同的概念,就像空串不是空字符串一样。
 
showmess。。。当然出错了。showmessage.

还有obj2:=obj1//这里obj2是一个obj1的副本。
freeandnil(obj1)并没有销毁obj1的副本。
showmessage(obj2.classname)//这里还是会出现对话框。
再加上一条freeandnil(obj2)。
 
type
PObject = ^TObject;

procedure TForm1.Button1Click(Sender: TObject);
var
obj1: TObject;
obj2: PObject;
begin
obj1 := TObject.Create;
obj2 := @Obj1;
FreeAndNil(obj1);
if Assigned(Obj2^) then
ShowMessage(Obj2^.ClassName);
end;
 
现在问题是释放Obj1的程序可能根本不知道Obj2的存在,怎么将Obj2释放呢!godelphi2004的方法倒是可以,但就是有点别扭
 
还是自己控制吧,obj2:=nil 拉倒
 
try
if obj2<>nil then
ShowMessage(obj2.ClassName);
except
obj2 := nil;
end;
 
支持iamy, 他说的是对的.
 
这个我都知道,现在就是不知道怎么判断一个对象变量是否有效
 
因为是个指针,很难判断是否指向内存被释放,最好就是,只要这块内存被释放,所有指向它的指针就 nil,这样就容易判断了
 
可以参考COM模型,使用引用计数。对于多引用对象,需要时才真正释放,
 
经典的问题,请看 http://www.delphibbs.com/delphibbs/dispq.asp?lid=1501542 以及
http://www.delphibbs.com/delphibbs/dispq.asp?lid=839586 这两个帖子吧。
 
由于你申明的是过程内对象变量,所以用Assigned是不行的.它只能检验全局的对象
应该用Obj2 = nil 是可以的
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
625
import
I
后退
顶部